Nicht modaler Dialog


Einleitung

Um diese Anleitung nicht zu lang werden zu lassen, schreibe ich immer nur die Dinge auf, die verändert werden müssen. Bei Codeabschnitten werden die Teile, die von mir verändert wurden fett geschrieben.

Beispiel

Aufgabe

Es soll ein nicht modaler Dialog erstellt werden. (Kurz und schmerzlos :-)
Dieser Dialog soll diesmal nicht von der Symbolleiste, sondern von einem Menüpunkt aufgerufen werden können.

Lösung in Prosa

  1. Zuerst wird ein neues Projekt gebraucht...
    -> Projektname : nonmodal
    -> SDI Anwendung
  2. Dann braucht man wie beim modalen Dialog eine Dialog-Ressource:
    -> Auf die Ressourcenansicht wechseln
    -> Rechte Maustaste auf Dialog
    -> Dialog einfügen
  3. Ich lass den Dialog mal leer, für dieses Beispiel ist es nicht notwendig Steuerelemente einzufügen, weil das genauso geht, wie beim modalen Dialog:
    -> Den Klassen-Assistenten aufrufen
    -> es wird automatisch eine Klasse für den Dialog erstellt...


  4. Die Datei in der sich die neue Klasse befindet muss noch in die Datei CnonmodalView.h includiert werden:
    die Datei nonmodalView.h sollte so aussehen:
    // nonmodalView.h : Schnittstelle der Klasse CNonmodalView
    //
    /////////////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_NONMODALVIEW_H__01C1A223_FB65_45AA_9668_C87CB57D5471__INCLUDED_)
    #define AFX_NONMODALVIEW_H__01C1A223_FB65_45AA_9668_C87CB57D5471__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #include "dialog.h"
    
    
    class CNonmodalView : public CView
    {
    	etc...
    
  5. Variable für den Dialog zur Klasse CnonmodalView hinzufügen:
    -> mit der rechten Maustaste auf die Klasse CnonmodalView drücken
    -> auf Member-Variable hinzufügen... drücken
  6. Varable muss im Konstruktor initialisiert werden:
    CNonmodalView::CNonmodalView()
    {
    	// ZU ERLEDIGEN: Hier Code zur Konstruktion einfügen,
    	dia = NULL;
    }
    
  7. Nun brauchen wir einen Eintrag in der Menüleiste:
    -> Auf die Ressourcenansicht wechseln
    -> auf Menü doppelt klicken
    -> auf IDR_MAINFRAME doppelt klicken

    -> Einen neuen Eintrag hinzufügen mit dem Namen : Dialog. Nun Popup deaktivieren und eine ID eingeben (selber aussuchen; ist egal was). Hinweis : dadurch wird der Button im Menü zu einem wirklichen Button, das heißt es geht beim Klick kein Menü auf wie sonst.
    -> Sich die eben vergebene ID merken

  8. Klassenassistenten öffnen:
    -> Klassenname CnonmodalView einstellen
    -> nach der ID suchen
    -> Funktion hinzufügen drücken

    -> Code bearbeiten drücken
    void CNonmodalView::OnDialog() 
    {
    	// Nur das erste Mal Dialog erstellen
    	if (dia == NULL)
    	{
    		// Objekt für Dialog erstellen
    		dia = new dialog();
    	}
    
    	// Wenn Dialog gerade nicht läuft
    	if (dia->GetSafeHwnd() == NULL)
    	{
    		// Dialog in Windows erstellen
    		// Die MFC braucht des
    		// 1. Parameter : Klassenname.IDD liefert Ressource-ID vom DIALOG
    		// 2. Parameter : Zeicher auf die View, muss so sein
    		dia->Create(dialog.IDD,this);
    		// Zeige Dialog
    		dia->ShowWindow(true);
    	}
    }
    
  9. Um den Dialog zu zerstören müssen noch die beiden Handler für den OK und den Abbrechen Button in der Dialogklasse dialog geändert werden.
    -> Klassenassistent
    -> Klassenname = dialog
    -> IDOK suchen, Funktion hinzufügen, Code bearbeiten
    void dialog::OnOK() 
    {
    	CDialog::OnOK();
    
    	// Dialog zerstören
    	DestroyWindow();
    }
    
    -> Klassenassistent
    -> Klassenname = dialog
    -> IDCANCEL suchen, Funktion hinzufügen, Code bearbeiten
    void dialog::OnCancel() 
    {
    	CDialog::OnCancel();
    
    	// Dialog zerstören
    	DestroyWindow();
    }
    
  10. Fertig