如何使用MFC从控制台正确弹出无模式对话框
我需要创建一个具有main()函数的控制台应用程序,并弹出一个无模式对话框,这样控制台仍然可以与无模式对话框并行工作(执行其他工作,如与无模式对话框通信) 无论我尝试了什么,我只能弹出一个模态对话框。(控制台处于保持状态,直到模态对话框自行关闭) 当使用Create()和ShowWindow()切换到无模式对话框时,对话框显示时不带控件,并且它冻结/阻止(您可以看到沙漏光标) 1) 我试图从main()函数中弹出无模式对话框:如何使用MFC从控制台正确弹出无模式对话框,mfc,console,dialog,modeless,Mfc,Console,Dialog,Modeless,我需要创建一个具有main()函数的控制台应用程序,并弹出一个无模式对话框,这样控制台仍然可以与无模式对话框并行工作(执行其他工作,如与无模式对话框通信) 无论我尝试了什么,我只能弹出一个模态对话框。(控制台处于保持状态,直到模态对话框自行关闭) 当使用Create()和ShowWindow()切换到无模式对话框时,对话框显示时不带控件,并且它冻结/阻止(您可以看到沙漏光标) 1) 我试图从main()函数中弹出无模式对话框: void main() { AfxWinInit(GetMo
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()中弹出无模式对话框: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以下代码片段解决了该问题:
#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);
}
另请查看以下链接: