【发布时间】:2018-11-11 21:45:16
【问题描述】:
我有一个基于 MFC 对话框的应用程序,它有 2 个对话框:主对话框 CMyDlg 和第二个对话框 CMyDlg2。
在主对话框上,我添加了一个按钮“转到对话框 2”。所以我为按钮添加了一个处理程序,以便在单击它时弹出第二个对话框。一切正常但在第二个对话框中,我从工具箱中添加了丰富的编辑控件。我为它添加了一个变量。我还为第二个对话框添加了一个类。
现在,如果我运行应用程序,我会得到对话框一,如果我按下“转到对话框 2”,我就会得到我想要的。但我有时需要更改富编辑控件的字体,但我的程序崩溃了。
所以我覆盖了OnInitDialog,并在其中对控件进行了一些更改,但程序崩溃了。调试后发现富编辑的句柄为空?!
那么如何以及在哪里可以更改颜色或对控件进行一些初始化?
(我在OnInitInstance()中调用了AfxInitRichEdit2())
BOOL CMyDlg2::OnInitDialog() {
m_richEdit.SetWindowText("Hello there!"); // program crashes because the handle m_richEdit is null.
return TRUE;
}
这是创建 Dialog2 并包含富编辑控件的按钮处理程序:
void CMyDlg::OnBnClickedButton1(){
CMyDlg2 theDlg;
theDlg.DoModal();
// TODO: Add your control notification handler code here
}
- 如果我以编程方式创建富编辑控件,那么一切正常,因为我在
OnInitDialog创建它,然后它工作正常,但我需要使用向导工具箱添加的那个。
***问题是,如果我写:
m_richEdit.SetWindowText(""); // program crashes but if I wirte:
GetDlgItem(IDC_RICHEDIT221).SetWindowText(""); it works fine?
【问题讨论】:
-
m_richEdit不会是NULL,但它的窗口句柄将是NULL,因为它还没有被创建为窗口。您必须先调用默认方法。改为:BOOL CMyDlg2::OnInitDialog(){__super::OnInitDialog();m_richEdit.SetWindowText("Hello there!");return TRUE;} -
准确地说,richedit 窗口已经在
CMyDlg2::OnInitDialog()中创建,但它不会与m_richEdit变量关联,除非基类的@ 987654336@方法被调用。 -
基本上就像 Barmak 写的那样,但
__super是微软特有的,我会写CDialog::OnInitDialog()代替,这是标准 C++。 -
看起来您现在正在调用基类方法
CMyDlg2::OnInitDialog(){CDialog::OnInitDialog(); ...}应该可以工作。 -
好的,不客气。