2010-03-25 30 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