Comment faire apparaître correctement une boîte de dialogue de la console en utilisant modeless MFC

StackOverflow https://stackoverflow.com/questions/2515148

  •  22-09-2019
  •  | 
  •  

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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top