Freigeben über


MODELESS-Beispiel: Verwendet ein CDialog-Objekt als nicht modales Dialogfeld

Aktualisiert: November 2007

Das MODELESS-Beispiel demonstriert die Verwendung eines CDialog-Objekts in MFC als nicht modales Dialogfeld. Bei MODELESS handelt es sich um eine einfache dialogfeldbasierte Anwendung, die ein Listenfeld im Hauptdialogfeld verwaltet. Zusätzlich können über ein nicht modales Dialogfeld Zeichenfolgen zum Listenfeld des Hauptfensters hinzugefügt werden.

Sicherheitshinweis:

Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird.

So rufen Sie Beispiele und Anweisungen für ihre Installation ab

  • Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.

    Weitere Informationen finden Sie unter Suchen von Beispieldateien.

  • Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.

  • Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.

Erstellen und Ausführen des Beispiels

So erstellen Sie das MODELESS-Beispiel und führen es aus

  1. Öffnen Sie die Projektmappe modeless.sln.

  2. Klicken Sie im Menü Erstellen auf Erstellen.

  3. Klicken Sie im Menü Debuggen auf Starten ohne Debuggen.

Nach dem Starten der Beispielanwendung wird ein leeres Listenfeld angezeigt. Sie können das Dialogfeld ohne Modus öffnen, indem Sie auf Hinzufügen klicken. Die Rückgabe des Fokus an das Hauptdialogfeld ist auch möglich, während das Dialogfeld Modeless Adder Dialog geöffnet ist. Um zu verhindern, dass versehentlich mehrere Instanzen des nicht modalen Dialogfelds geöffnet werden, steht die Schaltfläche Add im Hauptdialogfeld nur dann zur Verfügung, wenn das nicht modale Dialogfeld geschlossen ist.

Die CMainDlg-Klasse des Hauptdialogfelds verwaltet einen Zeiger auf das nicht modale Dialogfeld. Dies geschieht ausschließlich aus Komfortabilitätsgründen. Sobald das nicht modale Dialogfeld erstellt ist, ist kein weiterer Verwaltungsaufwand erforderlich. Unter Umständen empfiehlt es sich, in der Anwendung Informationen über das nicht modale Dialogfeld bereitzustellen. In diesem Fall würde der Zeiger gewissermaßen als Ausgangspunkt den Zugriff auf das C++-Objekt ermöglichen, das das Dialogfeld verwaltet.

Der Code für die Schaltfläche Add im Hauptdialogfeld wird vom nicht modalen Dialogfeld unter Verwendung der Create-Funktion und nicht durch den Aufruf von DoModal erzeugt. Durch diese Eigenschaft ist das Dialogfeld als nicht modales Feld definiert. Meldungen für dieses Dialogfeld werden von Windows entsprechend anders behandelt. Zum Zerstören des Dialogfelds wird nicht die EndDialog-Funktion, sondern die DestroyWindow-Funktion verwendet. Da die normalen Memberfunktionen OnOk und OnCancel eines CDialog-Objekts die EndDialog-Funktion aufrufen würden, müssen Sie sicherstellen, dass diese Funktionen nicht aufgerufen, sondern überschrieben und entsprechend durch die DestroyWindow-Funktion ersetzt werden.

Im Normalfall müssen nicht modale Dialogfelder nach Rückgabe von DoModal manuell zerstört werden. Da Sie jedoch bei der Anzeige des nicht modalen Dialogfelds nicht auf die Create-Rückgabe warten können, müssen Sie eine andere Methode anwenden, um das mit dem Fenster verknüpfte C++-Objekt zu zerstören. Im vorliegenden Beispiel kommt eine ganz einfache Methode zum Einsatz, bei der nach dem Zerstören des Nicht-Clientbereichs im Dialogfeld die delete this-Funktion (in PostNcDestroy) ausgeführt wird.

Beachten Sie, dass das nicht modale Dialogfeld mit dem übergeordneten Dialogfeld auf zwei unterschiedliche Arten kommuniziert. Erstens wird die Zeichenfolge im Edit-Steuerelement des nicht modalen Dialogfelds bei Betätigung der Schaltfläche OK dem Inhalt des Listenfelds im modalen Dialogfeld hinzugefügt. Zweitens wird bei Zerstörung des nicht modalen Fensters durch eine beliebige Methode die BoxDone-Funktion in dem modalen Fenster aufgerufen. Diese Funktion setzt den Zeiger auf das modale Dialogfeld zurück und reaktiviert die Schaltfläche Add.

Schlüsselwörter

Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:

AfxGetApp; CDC::DrawIcon; CDC::GetSafeHdc; CDialog::Create; CDialog::DoModal; CDialog::OnCancel; CDialog::OnOK; CListBox::AddString; CMenu::AppendMenu; CMenu::ModifyMenu; CRect::Height; CRect::Width; CString::IsEmpty; CString::LoadString; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWnd::DestroyWindow; CWnd::DoDataExchange; CWnd::EnableWindow; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetWindowText; CWnd::IsIconic; CWnd::OnPaint; CWnd::OnQueryDragIcon; CWnd::OnSysCommand; CWnd::PostNcDestroy; CWnd::SendMessage; CWnd::SetActiveWindow; GetSystemMenu; GetSystemMetrics; LoadIcon

Hinweis:

In diesem und einigen anderen Beispielen wurden die Änderungen an den Visual C++-Assistenten, -Bibliotheken und -Compilern noch nicht nachvollzogen. Sie demonstrieren aber dennoch, wie Sie die gewünschte Aufgabe durchführen können.

Siehe auch

Weitere Ressourcen

MFC-Beispiele