Как правильно открыть немодальное диалоговое окно с консоли с помощью MFC

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

  •  22-09-2019
  •  | 
  •  

Вопрос

Мне нужно создать консольное приложение с основной() функция и нажмите немодальный диалог, поэтому консоль по-прежнему может работать параллельно с немодальным диалогом (выполнять другую работу, например общаться с немодальным диалогом).

Что бы я ни пытался, я мог только вытащить модальный диалог.(где консоль удерживается до тех пор, пока модальное диалоговое окно не закроется).

При переключении на немодальный диалоговом окне с использованием Create() и ShowWindow(), диалоговое окно отображается без элементов управления, и оно заморозить/блокировать (вы можете увидеть курсор в виде песочных часов).

1) Я попытался вывести немодальное диалоговое окно из функции 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) Я попытался открыть немодальное диалоговое окно из InitInstance() производного класса 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);
}

Во всех случаях немодальный диалог зависает.

Я считаю, что это однострочное решение.
Пожалуйста помоги.

ТНХ,
Вертилка

Это было полезно?

Решение

Следующий фрагмент кода решает проблему:

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

Также посмотрите следующую ссылку: группы новостей Microsoft

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top