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

Posted

技术标签:

【中文标题】如何使用 MFC 从控制台正确弹出无模式对话框【英文标题】:How to correctly pop a modeless dialog from console using MFC 【发布时间】:2010-03-25 11:50:42 【问题描述】:

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

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

当使用 Create() 和 ShowWindow() 切换到 modeless 对话框时,对话框显示时没有控件并且它冻结/阻止(您可以看到沙漏光标) .

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

【问题讨论】:

【参考方案1】:

下面的代码sn-p解决问题:

#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 newsgroups

【讨论】:

以上是关于如何使用 MFC 从控制台正确弹出无模式对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何“正确关闭 MFC 无模式对话框并修复资源泄漏”

如何从 PCollection 中过滤出无值

如何在 MFC 中更改弹出窗口的默认位置

MFC对话框中如何响应弹出式菜单事件 点击按钮 弹出菜单 菜单消息事件响应不了

MFC单击菜单项如何弹出对话框?

如何创建一个模态的对话框