How to correctly pop a modeless dialog from console using MFC
我需要创建一个具有main()函数的控制台应用程序并弹出一个无模式对话框,以便该控制台仍可与无模式对话框并行工作(执行其他工作,例如与无模式对话框进行通信)。
无论我尝试什么,我都只能弹出一个模式对话框。 (控制台一直处于按住状态,直到模式对话框关闭为止)。
当使用Create()和ShowWindow()切换到无模式对话框时,该对话框将不显示其控件,并且冻结/阻止(您可以看到沙漏光标)。
1)我试图从main()函数弹出无模式对话框:
1 2 3 4 5 6 7 8 9 10 11 12 | void main() { AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW); TestGUI * gui; gui = new TestGUI(); gui->Create(TestGUI::IDD); gui->ShowWindow(SW_SHOW); // just to see if the modeless dialog responses Sleep(10000); } |
2)我试图从CWinApp派生类的InitInstance()中弹出无模式对话框:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow); class MyApp : public CWinApp { public: virtual BOOL InitInstance() { gui = new TestGUI(); gui->Create(TestGUI::IDD); gui->ShowWindow(SW_SHOW); return TRUE; } private: TestGUI * gui; }; MyApp my_app; void main() { AfxWinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW); // just to see if the modeless dialog responses Sleep(10000); } |
在所有情况下,无模式对话框都会冻结。
我相信这是一个单一的解决方案。
请帮忙。
TNX,Vertilka
以下代码片段解决了该问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include"stdafx.h" #include"TestGUI.h" DWORD WINAPI ModelessThreadFunc(LPVOID) { TestGUI gui; gui.Create(TestGUI::IDD); gui.ShowWindow(SW_SHOW); HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, L"CloseModelessDialog"); MSG msg; while(WaitForSingleObject(hEvent, 0) != WAIT_OBJECT_0) { while(::GetMessage(&msg, NULL, 0, 0)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } // event cleanup CloseHandle(hEvent); return 0; } void main() { // initialize MFC AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW); // create thread for the modeless dialog CreateThread(NULL, 0, ModelessThreadFunc, NULL, 0, NULL); // wait for the modeless dialog to close itself HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, L"CloseModelessDialog"); while(WaitForSingleObject(hEvent, 0) != WAIT_OBJECT_0) { // do other job } // event cleanup CloseHandle(hEvent); } |
还请查看以下链接:微软新闻组