Comment faire apparaître correctement une boîte de dialogue de la console en utilisant modeless MFC
Question
Je dois créer une application console qui a une fonction main () et pop un dialogue modeless , de sorte que la console peut encore fonctionner en parallèle à la boîte de dialogue modales ( d'autres travaux, comme la communication avec la boîte de dialogue modales).
Tout ce que j'ai essayé, je ne pouvais sauter un modal dialogue. (Où la console est en attente jusqu'à la fin de dialogue modale lui-même).
Lors du passage à modeless dialogue à l'aide Créer () et ShowWindow () la boîte de dialogue est affichée sans ses contrôles et gel / bloc (vous pouvez voir le curseur en forme de sablier) .
1) J'ai essayé de pop la boîte de dialogue modales de la fonction principale ():
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) J'ai essayé de faire éclater le dialogue modales du InitInstance () d'une classe dérivée CWinApp:
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);
}
Dans tous les cas, le gel de dialogue modales.
Je crois que c'est une solution d'une ligne.
S'il vous plaît aider.
TNX,
Vertilka
La solution
Après l'extrait de code résout le problème:
#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);
}
Regardez aussi le lien suivant: microsoft newsgroups