Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MFC从控制台正确弹出无模式对话框_Mfc_Console_Dialog_Modeless - Fatal编程技术网

如何使用MFC从控制台正确弹出无模式对话框

如何使用MFC从控制台正确弹出无模式对话框,mfc,console,dialog,modeless,Mfc,Console,Dialog,Modeless,我需要创建一个具有main()函数的控制台应用程序,并弹出一个无模式对话框,这样控制台仍然可以与无模式对话框并行工作(执行其他工作,如与无模式对话框通信) 无论我尝试了什么,我只能弹出一个模态对话框。(控制台处于保持状态,直到模态对话框自行关闭) 当使用Create()和ShowWindow()切换到无模式对话框时,对话框显示时不带控件,并且它冻结/阻止(您可以看到沙漏光标) 1) 我试图从main()函数中弹出无模式对话框: void main() { AfxWinInit(GetMo

我需要创建一个具有main()函数的控制台应用程序,并弹出一个无模式对话框,这样控制台仍然可以与无模式对话框并行工作(执行其他工作,如与无模式对话框通信)

无论我尝试了什么,我只能弹出一个模态对话框。(控制台处于保持状态,直到模态对话框自行关闭)

当使用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) 我试图从CWinApp派生类的InitInstance()中弹出无模式对话框:

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);
}
在所有情况下,无模式对话框都会冻结

我相信这是一个单线解决方案。
请帮忙


TNX,
Vertilka

以下代码片段解决了该问题:

#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);
}
另请查看以下链接: