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) 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、
ヴァーティルカ
解決
次のコード スニペットは問題を解決します。
#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);
}
次のリンクもご覧ください。 マイクロソフト ニュースグループ
所属していません StackOverflow