Come al pop correttamente una finestra di dialogo non modale dalla console utilizzando MFC

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

  •  22-09-2019
  •  | 
  •  

Domanda

Ho bisogno di creare un'applicazione console che ha un main () la funzione e pop una finestra di dialogo non modale , in modo che il console può ancora funzionare in parallelo alla finestra di dialogo non modale ( fare altri lavori, come la comunicazione con la finestra di dialogo non modale).

Qualunque cosa ho provato, ho potuto pop solo un modale finestra di dialogo. (Dove la console è in attesa fino alla finestra vicino modale stesso).

Quando si passa a non modale finestra di dialogo utilizzando Create () e ShowWindow () la finestra di dialogo viene visualizzato senza i suoi controlli e gelo / blocco (si può vedere il cursore clessidra) .

1) Ho cercato di estrarre la finestra di dialogo non modale dalla funzione 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) ho cercato di estrarre la finestra di dialogo non modale dal InitInstance () di una classe CWinApp derivata:

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

In tutti i casi la finestra di dialogo non modale congelamento.

Credo che questa è una soluzione di una riga.
Si prega di aiutare.

TNX,
Vertilka

È stato utile?

Soluzione

seguente frammento di codice risolve il problema:

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

Si veda anche al seguente link: microsoft newsgroup

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top