如何制作CDialog?

Posted

技术标签:

【中文标题】如何制作CDialog?【英文标题】:How to make a CDialog? 【发布时间】:2017-09-12 09:24:48 【问题描述】:

我尝试了多种方法,但基础是这样的:

#include <stdio.h>
#include <afxwin.h>


main( int argc, const char* argv[] )


   printf( "\nHello World\n\n" );

   CDialog *dlg = new CDialog();
   dlg->DoModal();

   while (true) 
      Sleep(1); // Sleep is a windows function
   

当我运行它时,我收到以下错误:

我在这个对话框中缺少什么?

我查找了几个资源,但所有资源都导致相同的错误消息。

谁能告诉我我没看到什么?

【问题讨论】:

你想显示一个对话框,好吧。但是你希望它包含什么?只是一些文字(改用MessageBox)?还是某种形式(改为创建一个基于对话框的项目)?还有什么? 最后我想从对话框中获取一些信息。但首先我想显示一个空对话框:D 要开始使用,只需使用 Visual Studio 应用程序向导创建一个“基于对话框”的应用程序。这将生成创建“空”对话框所需的代码。稍后您可以尝试从头开始做所有事情,但对于初学者,建议使用向导。 【参考方案1】:

在控制台应用程序中使用 MFC 需要一些初始化。 没有这个你会得到断言。

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: MFC initialization failed\n"));
        return 8;
    

您还必须使用绑定到 CDialog 的资源。您可以使用适当的构造函数。或者您使用类向导从 CDialog 派生您自己的对话框。

但是创建 MFC 控制台应用程序并使用对话框对我来说没有意义...您的问题可能需要更多详细信息,您想要做什么以及为什么要这样做。

在继续这种编程方式之前,您可能需要阅读一些书籍或文章。

【讨论】:

你不需要派生自CDialog。如果是这种情况,所有显式构造函数都将受到保护(它们是 not)。但是,您可以做的事情相当有限(因为实际上,除了允许来自CDialog 的默认处理之外,您没有做任何事情。这个答案最重要的部分是(a)正确设置 MFC, (b) 确保对话框绑定到资源(而不是使用未绑定的构造函数)。既不当前在 OPs 代码中,both 都应该是. 感谢您的建议。改变了我的答案。

以上是关于如何制作CDialog?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CDialog::SetDefId 与非按钮控件一起使用?

如何使用修改后的 DLGTEMPLATEEX 调用 CDialog::DoModal()

如何使用 std::async 显示 Cdialog

如何在CDialog中让EnableMenuItem有效...

如何知道 CDialog 派生类中的焦点何时更改

如何在 CWinThread 派生类中正确创建 CDialog 框