如何在单独的 mfc 控制台应用程序中使用 mfc 应用程序的对话框?

Posted

技术标签:

【中文标题】如何在单独的 mfc 控制台应用程序中使用 mfc 应用程序的对话框?【英文标题】:How do I use an mfc application's dialog box in a separate mfc console application? 【发布时间】:2013-07-08 18:39:31 【问题描述】:

我有两个 MFC 应用程序。其中一个只是一个对话框,带有一些支持它的功能,另一个是控制台应用程序。如何使控制台应用程序能够打开位于其他应用程序中的对话框?

我尝试将对话应用程序构建为 dll 并导入它。此外,将现有项目添加到控制台项目并以这种方式链接它们。虽然我相信我已经关闭了链接,但我永远无法让控制台实例化对话框。有可能我也以错误的方式处理这部分。

有没有一种简单的方法可以导出我创建的对话框并将其导入另一个程序?如果我创建了一个名为“input”的项目并且它生成了 inputDlg.h/inputDlg.cpp,为什么我不能将它们移到另一个项目中并从它们那里调用?还是无法在初始项目之外使用对话框?

【问题讨论】:

【参考方案1】:

对话框(或任何其他 GUI 窗口)需要消息泵,但控制台应用程序通常没有消息泵。如果您希望控制台应用程序等到对话框关闭,最简单的方法是使用 Win32 API 而不是 MFC。只需通过调用 DialogBox 创建一个对话框。该 API 提供了自己的消息循环。

否则,您将采用多线程方法,控制台在主线程中运行。启动一个带有消息泵的辅助线程,并在该线程中创建基于 CDialog 的对话框。

【讨论】:

第一段有点混乱。从第一句话开始,我就在想“那不正确,模式对话框提供了自己的消息泵”。但是,你最后说了。问题只是 MFC 类绕过标准模态机制。【参考方案2】:

做我需要的:

    我在 Visual Studio 中打开了这两个项目的资源文件,并简单地复制/粘贴了我想在资源视图中传输的对话框。 然后我关闭了所有内容并打开了控制台项目。它包含我传输的对话框。我在资源视图中双击它,它打开了。 它仍然没有与之关联的类,所以我双击框架并打开了类向导。我将其命名为与第一个对话框项目中的名称相同 (WhateverDlg.h/WhateverDlg.cpp)。 然后我可以将我的代码从对话框项目复制并粘贴到控制台项目中。我只需要删除几行引用包装器 (Whatever.h) 的行,就完成了。

这使我能够在我的控制台程序中包含 WhatDlg.h 并使用 DoModal()。成功!

【讨论】:

以上是关于如何在单独的 mfc 控制台应用程序中使用 mfc 应用程序的对话框?的主要内容,如果未能解决你的问题,请参考以下文章

未调用 MFC 的 CWinThread::PostThreadMessage 处理程序

如何使用 MFC 处理单独的窗口?

使用 C++/MFC 和 C# 中的插件扩展 C++/MFC 应用程序

更改 MFC 应用程序的输入控件

是否有可能/有必要在单独的线程中调用 OnDraw [MFC]

控制台程序可以使用MFC里面的一些函数和类吗