2010-03-25 28 views
0

正确地弹出,从控制台的无模式对话框我需要创建一个具有的main()功能的控制台应用程序,并弹出一个无模式对话框,所以控制台可以并行还是工作无模式对话框(做其他工作,例如与无模式对话进行沟通)。如何使用MFC

无论我尝试过什么,我只能弹出一个模态对话框。 (控制台处于等待模式对话框关闭的状态)。

当使用create()和的ShowWindow()被显示没有其控制的对话框和它冷冻/块(你可以看到沙漏光标)切换到无模式对话框。

1)我试图从main()函数弹出模态对话框:

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)I试图从一个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

回答

2

下面的代码解决了这个问题:

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

也看一下下面的链接:microsoft newsgroups