【问题标题】:What is a good way to add MFC gui to a Win32 C++ command line application?将 MFC gui 添加到 Win32 C++ 命令行应用程序的好方法是什么?
【发布时间】:2010-12-28 12:39:16
【问题描述】:

我们有一个可以从 GUI 中受益的命令行应用程序。我们想要添加一些绘图功能,并确定了一个使用 MFC 的绘图库。最初我们开发了一个单独的应用程序,但我们宁愿将 GUI 放在同一个进程空间中。

我在考虑可能是 MFC DLL 中的 GUI,它可以托管在生产应用程序和测试应用程序中。

问题是:

  • 将 MFC GUI 添加到 win32 命令行应用程序需要哪些步骤
  • 是否可以在 MFC DLL 中创建 GUI,如何实现? (以便不同的应用可以重复使用相同的 GUI)

编辑

我应该补充一点,这是一个非托管应用程序(并且需要保持这种状态 - 它需要高性能,广泛使用模板、boost、自定义分配器、内部开发的线程序列化等)

结果:

Nick D 的回答效果很好 - especially the follow-up link in his comment with the details about a regular MFC DLL

请注意,我们将在下一次迭代中使用 Qt。这次修改我们的构建环境并习惯一个新的框架实在是太过分了。

【问题讨论】:

  • 我没有 VS 2008,但第一步是创建一个“MFC AppWizard (dll)”项目或类似的项目。
  • 尼克,对,然后呢?魔鬼在细节中——比如如何在现有的 exe 中添加 MFC 支持?有必要吗?

标签: c++ visual-studio-2008 user-interface mfc


【解决方案1】:

您可以在 dll 中调用/重用 GUI 代码。 (我什至在我的 C++ 项目中使用 Delphi 表单)

一个非常简单的dll例子:

// The DLL exports foo() function
void foo()
{
    AFX_MANAGE_STATE( AfxGetStaticModuleState() );

    CDlgFoo dlg;
    dlg.DoModal();
}

在控制台程序中,您将拥有如下代码:

h = ::LoadLibrary( "my.dll" );
::DisableThreadLibraryCalls( h ); 
pfoo = (foo_type*)::GetProcAddress( h, (const char*)1 );
if ( pfoo ) pfoo();

【讨论】:

  • 太棒了 - 在非 mfc 应用程序中我还有什么需要做的吗?它会起作用吗?我想我会为那个线程/gui函数启动一个新线程?我需要在 GetProcAddress 中调用的导出方法的名称是什么(假设是基于 dlg 的 gui)?
  • 在我的示例中 GetProcAddress(h, "foo") 也应该可以工作。我认为您不需要额外的 gui 代码线程,但这取决于您的需要。
【解决方案2】:

首先,您必须放弃 WinMain()。

如果您仍想保留命令行参数功能,请在 App 类的 InitInstance() 中处理命令参数。

【讨论】:

  • “投降”winmain是什么意思?该 exe 是一个命令行 exe - 没有 gui,没有事件循环 - 只是一个 main
  • 我的意思是放弃应用入口点。也就是说,CLI 应用程序的 main() 和 GUI 应用程序的 WinMain()。 MFC 是一个框架而不是一个库,它实现了自己的 WinMain() 入口点,你不能有两个。
  • 所以我不能只调用一个 dll 或其他东西并启动一个新线程以用作其 GUI 线程/事件循环吗?
【解决方案3】:

直接的方法是在程序中添加一个开关,并给定一个特定的值,它将启动 gui,否则使用命令行选项。类似“app.exe -mode=gui”的东西。如果您在程序启动时没有看到此命令 arg,请回退到旧的命令行行为。

关于 DLL,您可以在 DLL 中编写所有 UI 功能,并在运行消息循环和 WinMain 的“生产应用程序”中使用它。但有什么意义呢?如果是出于测试目的,为什么不将表示与逻辑分开并单独测试逻辑。无论如何,您打算如何在您的测试应用程序中测试 UI?模拟按钮点击?

【讨论】:

  • +1 用于不同的运行“模式 - gui/no gui。我也在考虑这个 - 我们希望在不重新编译的情况下打开或关闭 gui 运行。测试真的让我不不需要实时应用程序 - gui 非常小 - 直方图 - 主 exe 收集大量数据并具有一些重要的资源依赖关系。我想要一个轻量级的测试应用程序,可以为其提供 timple 数据。
  • 对我来说,这看起来是一个完美的例子,您需要将逻辑移动到库 (dll) 并在测试/生产应用程序中使用该库。
  • 当我们谈到 GUI 时,选择 MFC 有什么理由吗?我强烈推荐 Qt(你免费获得跨平台,你永远不知道......)。我还在这里qwt.sourceforge.net 找到了一些绘图小部件,我敢打赌还有更多。
  • 我知道 Qt 很棒,但我们在 MFC 方面有更多经验,而且我们使用的图表库已经过 mfc 测试。我们正在尝试 wxwidgets,但使用新 UI 框架的学习曲线并没有帮助。我看了很多 pl 我很想使用 Qt 和那个绘图库,但是我们有一些时间压力而且我们不熟悉。
  • 这也是我想保持 GUI 独立的原因——因为我们知道我们最终会跨平台。我们将迁移到另一个绘图和 UI 框架 - 只是不适用于 v1(或者至少这是当前计划)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2011-12-10
  • 2012-04-21
  • 2010-11-07
相关资源
最近更新 更多