2009-08-04 24 views
8

Ich habe einen Dialog (CDialog abgeleitete Klasse), der auf zwei verschiedene Arten benutzt werden kann (Editiermodus und Programmiermodus).Konvertiere einen modalen Dialog zur Laufzeit in modal

Wenn der Dialog geöffnet wird, um im Programmiermodus verwendet zu werden, ist es ein nicht modaler Dialog, der für das Ändern der Hauptansicht (Art einer Symbolleiste) verwendet wird. Wenn es im Bearbeitungsmodus geöffnet ist, kann der Benutzer die Konfiguration des Dialogs selbst ändern und in diesem Fall ist es ein modaler Dialog.

Im Moment sind es zwei verschiedene Dialoge mit wenigen Unterschieden und ich möchte nur einen Dialog haben und den Benutzer zwischen dem Programmiermodus und dem Editiermodus wechseln lassen, nur durch Drücken einer Taste im Dialog.

Also muss ich den modalen Dialog in einem modalen Dialog und umgekehrt zur Laufzeit konvertieren. Gibt es einen Weg, das zu erreichen?

Danke.

Antwort

11

Wie vielleicht jemand etwas ähnliches in der Zukunft daran interessiert sein könnte, das ist die Art, wie ich es schließlich tat

ich diese beiden Funktionen des Hauptrahmens verwenden: CMainFrame::BeginModalState() und CMainFrame::EndModalState().

Das Problem mit diesen Funktionen ist das gleiche wie beim Deaktivieren des übergeordneten Fensters. Das Fenster, das modal erstellt werden soll, wird ebenfalls deaktiviert. Aber die Lösung ist einfach. Aktivieren Sie das Fenster einfach erneut, nachdem Sie BeginModalState aufgerufen haben.

void CMyDialog::MakeModal() 
{ 
    //disable all main window descendants 
    AfxGetMainWnd()->BeginModalState(); 

    //re-enable this window 
    EnableWindow(TRUE); 
} 

void CMyDialog::MakeModeless() 
{ 
    //enable all main window descendants 
    AfxGetMainWnd()->EndModalState(); 
} 

Danke für Ihre Hilfe.

2

Das geht nicht leicht ohne den Dialog zu schließen und erneut zu öffnen. Dann können Sie ShowWindow oder DoModal entsprechend aufrufen.

1

Das ist nicht korrekt. Dies ist möglich, wenn Sie die Quelle von MFC betrachten, werden Sie feststellen, dass modale Dialoge technisch nicht modal sind. Sie müssen viel Mucking machen, um dies richtig funktionieren zu lassen, aber im Grunde müssen Sie nur das Parent des 'modalen' Fensters deaktivieren und es wieder aktivieren, wenn das 'modale' Fenster geschlossen wird.

Ich habe dies persönlich getan, damit dies für Sie funktioniert, obwohl ich nicht genau weiß, was Sie zu tun versuchen.

+0

Was meinst du mit Deaktivieren/Aktivieren der Eltern? Ich habe bereits versucht, GetParent() -> EnableWindow (FALSE)/GetParent() -> EnableWindow (TRUE) aufzurufen, aber das hat nicht funktioniert, weil mein Dialog auch deaktiviert wurde. Das Elternfenster ist zufällig der Hauptrahmen, ich weiß nicht, ob dies relevant ist. BTW: Was ich tun möchte, ist ein nicht modales Dialogfeld (Create/ShowWindow) zu öffnen, wenn der Benutzer eine Taste drückt, wird der Dialog modal. Wenn der Benutzer die Taste erneut drückt, wird der Dialog wieder nicht mehr modal. –

Verwandte Themen