¿Cómo hacer estallar correctamente un cuadro de diálogo modal desde la consola utilizando MFC

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

  •  22-09-2019
  •  | 
  •  

Pregunta

Es necesario crear una aplicación de consola que tiene un principal () y pop una no modal de diálogo , por lo que la consola todavía puede trabajar en paralelo con el diálogo no modal ( hacer otro trabajo, como la comunicación con el diálogo no modal).

Lo que he intentado, sólo podía estallar un de diálogo modal. (Donde la consola está en espera hasta que el propio cierre de diálogo modal).

Cuando se cambia a modal de diálogo usando Create () y ShowWindow () del cuadro de diálogo se muestra sin sus controles y congelación / bloque (se puede ver el cursor de reloj de arena) .

1) que intentó hacer estallar el diálogo no modal de la función 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) que intentó hacer estallar el diálogo no modal de la InitInstance () de una clase derivada de 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);
}

En todos los casos, la congelación de diálogo no modal.

Creo que esta es una solución de una sola línea.
Por favor, ayuda.

TNX,
Vertilka

¿Fue útil?

Solución

siguiente código resuelve el problema de fragmento:

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

También mira el siguiente enlace: grupos de noticias de Microsoft

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top