2009-08-04 9 views
8

Mam okno dialogowe (klasa pochodna CDialog), które może być używane na dwa różne sposoby (tryb edycji i tryb programowania).Konwersja niemodalnego okna dialogowego na modalne w środowisku wykonawczym

Gdy okno dialogowe jest otwarte do użycia w trybie programowania, jest to niemodalne okno dialogowe, które służy do modyfikowania głównego widoku (rodzaj paska narzędzi). Gdy jest otwarty w trybie edycji, użytkownik może zmienić konfigurację samego okna dialogowego iw tym przypadku jest to dialog modalny.

W tej chwili są to dwa różne okna dialogowe z kilkoma różnicami i chciałbym mieć tylko okno dialogowe i pozwolić użytkownikowi na przełączanie się pomiędzy trybem programowania i trybem edycji po prostu przez naciśnięcie przycisku w oknie dialogowym.

Potrzebuję przekonwertować okno dialogowe niemodalne w modalnym oknie dialogowym i na odwrót w czasie wykonywania. Czy istnieje sposób, aby to osiągnąć?

Dzięki.

Odpowiedz

11

Jak może ktoś mógłby być zainteresowany w tym coś podobnego w przyszłości, to jest sposób, w końcu to zrobił:

Używam tego dwie funkcje ramy głównej: CMainFrame::BeginModalState() i CMainFrame::EndModalState().

Problem z tymi funkcjami jest taki sam jak w przypadku wyłączenia okna nadrzędnego. Okno, które chcesz uczynić modalnym, również zostanie wyłączone. Ale rozwiązanie jest proste, wystarczy ponownie włączyć okno po wywołaniu 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(); 
} 

Dzięki za pomoc.

2

Nie można tego zrobić łatwo bez zamykania i ponownego otwierania okna dialogowego. Następnie możesz wywołać ShowWindow lub DoModal odpowiednio.

1

To nie jest poprawne. Można to zrobić, jeśli spojrzysz na źródło MFC, zdasz sobie sprawę, że to modalne dialogi nie są technicznie nawet modalne. Będziesz musiał zrobić wiele głupstw, aby to działało poprawnie, ale musisz po prostu wyłączyć rodzica okna "modalnego" i ponownie włączyć go, gdy okno "modalne" się zamknie.

Zrobiłem to osobiście, więc może ci pomóc, chociaż nie jestem do końca pewien, co próbujesz zrobić.

+0

Co masz na myśli mówiąc o wyłączeniu/włączeniu rodzica? Próbowałem już wywołać GetParent() -> EnableWindow (FALSE)/GetParent() -> EnableWindow (TRUE), ale to nie zadziałało, ponieważ moje okno dialogowe również zostało wyłączone. Okno główne jest główną ramką, nie wiem, czy jest to istotne. BTW: Chcę otworzyć okno dialogowe bez modelu (Create/ShowWindow), gdy użytkownik naciśnie przycisk, okno dialogowe stanie się modalne. Jeśli użytkownik naciśnie przycisk ponownie, okno dialogowe ponownie stanie się niemodne. –

Powiązane problemy