2009-12-04 13 views
5

Potrzebuję otworzyć okno dialogowe utworzone dwa razy z tej samej klasy. Gdy próbuję tego dokonać, drugie połączenie otwiera okno dialogowe tylko na ułamek sekundy, a następnie jest zamykane. Mój zakład jest tam resztki wiadomość w kolejce komunikatów, więc dodałem to w między połączeniamiPonownie otwórz okno dialogowe modalne w MFC

MSG msgCur; 
while (::PeekMessage(&msgCur, NULL, NULL, NULL, PM_REMOVE)) 
    ; 

To rozwiązuje problem, ale czuje się jak w złym rodzaju rzeczy do zrobienia. Czy istnieje sposób na poprawne przetworzenie pozostałego komunikatu?

+0

To wygląda dziwnie, co dokładnie chcesz osiągnąć? –

+0

Muszę zachować działanie aplikacji bez interfejsu użytkownika i otwierać to okno dialogowe za każdym razem, gdy skończy się czas. – MMx

+0

W jaki sposób zamykasz okno dialogowe? –

Odpowiedz

1

Nie wywoływać EndDialog (IDOK);

Aby obsłużyć naciśnięte przyciski ok lub anuluj, po prostu dziedzicz OnOk lub OnCancel ... W przeciwnym razie EndDialog zostanie wywołane dwa razy, a otrzymasz problem, który otrzymujesz!

0

Jeśli chcesz, aby Twoja aplikacja działała w tle bez interfejsu użytkownika, to dlaczego nie chcesz go ukryć? prosta funkcja to-> ShowWindow (SW_HIDE) zrobi to za ciebie.

Myślę, że powinieneś zrewidować swoją decyzję projektową, ponieważ wydaje się nielogiczne, aby aplikacja zachowywała się tak, jak chcesz.

1

Właściwie uważam, że YeenFei ma tu dobry punkt.

Minęło trochę czasu, odkąd grałem z MFC (dzięki Bogu), ale z pamięci, zegar, może, ale nie musi być wywołany z wątku UI w zależności od tego, którego używasz. Jeśli licznik jest podnoszony w głównym wątku UI, to modalne okno dialogowe prawdopodobnie zatrzyma główny wątek, dopóki nie zostanie zwolniony, po czym zostanie wywołany przez następny zegar. Jeśli licznik zostanie podniesiony w osobnym wątku, to okno dialogowe nie blokuje głównego wątku interfejsu użytkownika, ponieważ jest pokazywane w osobnym wątku.

To wydaje się bardziej prawdopodobne, ponieważ YeenFei wskazał, że chcesz ponownie pokazać okno dialogowe za każdym razem, gdy zegar zostanie podniesiony, ukrywając go, gdy użytkownik kliknie przycisk, aby go odrzucić. W ten sposób, jeśli czas zostanie podniesiony ponownie, wszystko, co robi, to ponowne wyświetlenie okna dialogowego, czy jest ono aktualnie otwarte, czy nie.

Istnieje świetny wpis here (www.eggheadcafe.com) o programach czasowych i współbieżności, które mogą okazać się interesujące i mogą sprawić, że sprawy staną się jaśniejsze niż to, co udało mi się osiągnąć.

1

Dlaczego nie można zakodować to tak:

CdelmeDlg dlg; 
dlg.DoModal(); 

CdelmeDlg dlg1; 
dlg1.DoModal(); 
0

I rozwiązać problem, ukrywając okno zamiast zamykania i uruchamiania innego wątku, że pierwsze śpi a następnie Odkrywa okno.

0

Może być Twój kod ma wiersz:

m_pMainWnd = &dlg; 

Jeśli tak, niż wniosku po pierwszym wezwaniu DoModal() będzie zakończona, wszystkie inne wezwanie DoModal() zwróci -1. Z MSDN:

Biblioteka klasy Microsoft Foundation automatycznie przerwie wątek po zamknięciu okna, do którego odwołuje się m_pMainWnd. Jeśli ten wątek jest głównym wątkiem aplikacji, aplikacja również zostanie zakończona.

Powiązane problemy