关于对话框应用程序中的变量应在何处进行初始化的问题

本文探讨了在MFC对话框程序中初始化成员变量的最佳实践,特别是在构造函数与OnInitDialog()函数之间的选择。通过实例说明了为何某些类型的初始化更适合在OnInitDialog()中执行。

本人建议在OnInitDialog()函数中初始化成员变量,尽量不要在构造函数中初始化。

如:创建对话框应用程序并生成"CCalculatorDlg"类,继承于"CDialog"类。

该问题基于"CCalculatorDlg"类来进行说明:

在CCalculatorDlg类中定义了double m_data和CEdit *m_pEdit两个成员变量

1.在CCalculatorDlg()构造函数或者OnInitDialog()函数中都可以对这两个变量进行如下初始化:

m_data=0;

m_pEdit=NULL;

2.可以在OnInitDialog()函数中进行如下初始化:

m_data=0;

m_pEdit=(CEdit *)this->GetDlgItem(IDC_EDIT);//IDC_EDIT为对话框中的CEdit控件ID

3.在CCalculatorDlg()构造函数中如果进行如下初始化:

m_pEdit=(CEdit *)this->GetDlgItem(IDC_EDIT);//IDC_EDIT为对话框中的CEdit控件ID

则会在生成"Debug解决方案"时报错,而在生成"Release解决方案"时不会报错。

在生成"Debug解决方案"时所报的错:

Debug Assertion Failed!

Program:...

File:...\winocc.cpp

Line:92

打开winocc.cpp并跳至第92行

 CWnd* CWnd::GetDlgItem(int nID) const { ASSERT(::IsWindow(m_hWnd));//此为第92行 if (m_pCtrlCont == NULL) return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID)); else return m_pCtrlCont->GetDlgItem(nID); }

该语句断言m_hWnd是否为窗体句柄,只在生成"Debug解决方案"时执行该语句,而生成"Release解决方案"时跳过该断言宏。

至于它为什么会报错我是这样子理解的:在生成CCalculatorDlg对话框并调用CCalculatorDlg()构造函数时其基类CWnd中的m_hWnd还为来得及初始化(即m_hWnd==NULL),因此执行第92行的断言肯定会出错,因此最好把此类的初始化放在OnInitDialog()中。

转载于:https://www.cnblogs.com/wackelbh/archive/2009/12/03/1984072.html

在MFC对话框应用程序中,初始化Rich Edit控件并处理按钮点击事件是构建交互式应用程序的关键步骤。这里,我们将重点介绍如何使用AfxInitRichEdit()函数初始化Rich Edit控件,并设置按钮点击事件的响方法。 参考资源链接:[使用MFC创建对话框应用程序及控件操作指南](https://wenku.youkuaiyun.com/doc/4ag3tb2nyg?spm=1055.2569.3001.10343) 首先,确保你的项目中已经包含了支持Rich Edit控件的动态链接库(DLL),通常为msftedit.dll。在对话框类的头文件(.h)中,声明一个CRichEditCtrl类的对象作为成员变量,用于访问和操作Rich Edit控件。 ```cpp class CYourDialog : public CDialog { // ... 其他成员变量和函数声明 ... CRichEditCtrl m_RichEditCtrl; // Rich Edit控件成员变量 // ... 其他成员变量和函数声明 ... }; ``` 在对话框的资源文件中,添加一个Rich Edit控件,并为它设置一个控件ID,例如IDC_RICHEDIT。 然后,在对话框类的构造函数中,初始化你的Rich Edit控件: ```cpp CYourDialog::CYourDialog(CWnd* pParent /*=NULL*/) : CDialog(IDD_YOURDIALOG, pParent) { // 初始化Rich Edit控件 m_RichEditCtrl.SubclassDlgItem(IDC_RICHEDIT, this); AfxInitRichEdit(); // 确保Rich Edit控件可用 } ``` 注意,AfxInitRichEdit()是调用Rich Edit API初始化函数的辅助宏,它确保了Rich Edit控件在应用程序中可以正常工作。 接下来,为按钮控件添加事件处理函数。假设你有一个ID为IDC_BUTTON.OK的按钮,用于触发事件,你需要为它添加一个消息处理函数ON_BN_CLICKED: ```cpp void CYourDialog::OnBnClickedButtonOk() { // 按钮点击事件的处理代码 // 例如,获取Rich Edit控件中的文本 CString strText; m_RichEditCtrl.GetWindowText(strText); // 这里可以添加你的逻辑代码 } ``` 最后,在对话框的DoModal()函数中,当对话框显示时,上述初始化代码将被调用,而按钮点击事件将触发OnBnClickedButtonOk()函数。 通过以上步骤,你可以在MFC对话框应用程序中成功初始化Rich Edit控件,并响按钮点击事件,从而实现基本的用户交互功能。为了进一步加深理解,建议阅读《使用MFC创建对话框应用程序及控件操作指南》中的相关章节,它详细介绍了创建对话框、控件使用以及事件处理的更多细节。 参考资源链接:[使用MFC创建对话框应用程序及控件操作指南](https://wenku.youkuaiyun.com/doc/4ag3tb2nyg?spm=1055.2569.3001.10343)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值