Pergunta

Eu preciso criar um aplicativo de console que tenha um a Principal() função e pop a diálogo modificado, para que o console ainda possa funcionar em paralelo à caixa de diálogo modente (faça outro trabalho, como se comunicar com a caixa de diálogo modificada).

O que quer que eu tentei, eu só podia estourar um modal diálogo. (onde o console está em espera até que a caixa de diálogo modal se feche).

Ao mudar para modeless diálogo usando create () e showwindow () a caixa de diálogo é exibida sem seus controles e ele congelamento / bloco (Você pode ver o cursor da ampulheta).

1) Tentei colocar a caixa de diálogo modificada da função 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) Tentei colocar a caixa de diálogo modificada do initInstance () de uma classe derivada do 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);
}

Em todos os casos, a caixa de diálogo moda congelamento.

Eu acredito que esta é uma solução de uma linha.
Por favor ajude.

TNX,
Vertilka

Foi útil?

Solução

A seguir, o snippet de código resolve o 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);
}

Veja também o seguinte link: Grupos de notícias da Microsoft

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top