将MFC gui添加到Win32 C ++命令行应用程序的好方法是什么?

时间:2009-12-20 17:10:38

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

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

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

问题是:

  • 将MFC GUI添加到win32命令行应用程序所需的步骤
  • 是否可以在MFC DLL中创建GUI以及如何完成? (以便不同的应用程序可以重用相同的GUI)

修改

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

结果:

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

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

3 个答案:

答案 0 :(得分:3)

您可以在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();

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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