2009-08-04 1 views
8

Ho una finestra di dialogo (classe derivata da CDialog) che può essere utilizzata in due modi diversi (modalità di edizione e modalità di programmazione).Converti una finestra di dialogo non modale in fase di esecuzione

Quando la finestra di dialogo è aperta per essere utilizzata in modalità di programmazione, è una finestra di dialogo non modale che viene utilizzata per modificare la vista principale (tipo di una barra degli strumenti). Quando è aperto in modalità di edizione, l'utente può modificare la configurazione della finestra di dialogo stessa e in questo caso è una finestra di dialogo modale.

In questo momento sono due finestre di dialogo diverse con poche differenze e mi piacerebbe solo volere un dialogo e consentire all'utente di passare dalla modalità di programmazione alla modalità di edizione semplicemente premendo un pulsante nella finestra di dialogo.

Quindi ho bisogno di convertire la finestra di dialogo non modale in una finestra di dialogo modale e viceversa in fase di esecuzione. C'è un modo per ottenerlo?

Grazie.

risposta

11

Come forse qualcuno potrebbe essere interessato a fare qualcosa di simile in futuro, questo è il modo in cui alla fine l'ho fatto:

Io uso questa due funzioni del telaio principale: CMainFrame::BeginModalState() e CMainFrame::EndModalState().

Il problema con queste funzioni è lo stesso con la disabilitazione della finestra padre. Anche la finestra che vuoi rendere modale viene disabilitata. Ma la soluzione è semplice, basta riattivare la finestra dopo aver chiamato BeginModalState.

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(); 
} 

Grazie per il vostro aiuto.

2

Questo non può essere fatto facilmente senza chiudere e riaprire la finestra di dialogo. Quindi puoi chiamare ShowWindow o DoModal come appropriato.

1

Non è corretto. Questo può essere fatto, se guardi alla sorgente di MFC ti renderai conto che i dialoghi modali non sono tecnicamente nemmeno modali. Dovrai fare un sacco di cose per farlo funzionare correttamente, ma in pratica devi solo disabilitare il genitore della finestra 'modale' e riattivarlo quando la finestra 'modale' si chiude.

Ho fatto questo personalmente così questo potrebbe funzionare per voi, anche se non sono esattamente sicuro di ciò che state cercando di fare.

+0

Cosa intendi con disabilitare/abilitare il genitore? Ho già provato a chiamare GetParent() -> EnableWindow (FALSE)/GetParent() -> EnableWindow (TRUE), ma questo non ha funzionato perché anche la mia finestra di dialogo veniva disabilitata. La finestra genitore è il frame principale che non so se questo è rilevante. BTW: Quello che voglio fare è aprire una finestra di dialogo non modale (Crea/Mostra Finestra) quando l'utente preme un pulsante, la finestra di dialogo diventa modale. Se l'utente preme di nuovo il pulsante, la finestra di dialogo diventa nuovamente non modale. –