C++ 在何处初始化另一个对话框上的富编辑控件?
我有一个基于MFC对话框的应用程序,它有两个对话框:主对话框C++ 在何处初始化另一个对话框上的富编辑控件?,c++,mfc,C++,Mfc,我有一个基于MFC对话框的应用程序,它有两个对话框:主对话框CMyDlg和第二个对话框CMyDlg2 在主对话框上,我添加了一个按钮“Go Dialog 2”。因此,我为按钮添加了一个处理程序,当单击按钮时,它会弹出第二个对话框。一切正常,但在第二个对话框中,我从工具箱中添加了一个丰富的编辑控件。我为它添加了一个变量。我还为第二个对话框添加了一个类 现在,如果我运行应用程序,我会得到对话框1,如果我按下“转到对话框2”,我会得到我想要的。但我需要在某个时候更改rich edit控件的字体,但我的
CMyDlg
和第二个对话框CMyDlg2
在主对话框上,我添加了一个按钮“Go Dialog 2”。因此,我为按钮添加了一个处理程序,当单击按钮时,它会弹出第二个对话框。一切正常,但在第二个对话框中,我从工具箱中添加了一个丰富的编辑控件。我为它添加了一个变量。我还为第二个对话框添加了一个类
现在,如果我运行应用程序,我会得到对话框1,如果我按下“转到对话框2”,我会得到我想要的。但我需要在某个时候更改rich edit控件的字体,但我的程序崩溃了
因此,我重写了OnInitDialog,并在其内部对控件进行了一些更改,但程序崩溃。调试后发现rich edit的句柄为空
因此,如何以及在何处更改颜色或对控件进行一些初始化
(我在OnInitInstance()中调用了AfxInitRichEdit2()
)
这是创建对话框2的按钮处理程序,它包含丰富的编辑控件:
void CMyDlg::OnBnClickedButton1(){
CMyDlg2 theDlg;
theDlg.DoModal();
// TODO: Add your control notification handler code here
}
- 如果我以编程方式创建rich edit控件,那么一切都可以正常工作,因为我在InitDialog上创建了它,然后它可以正常工作,但我需要使用向导工具箱添加的控件
***问题是如果我写:
m_richEdit.SetWindowText(""); // program crashes but if I wirte:
GetDlgItem(IDC_RICHEDIT221).SetWindowText(""); it works fine?
向导可能插入了以下代码:
void DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_RICHEDIT22, m_richEdit);
}
这告诉对话框将m_richEdit
与对话框控件IDC_RICHEDIT22
关联。但是只有基类方法CDialog::OnInitDialog()才能执行此关联代码>被调用
BOOL CMyDlg2::OnInitDialog()
{
//this line should work:
GetDlgItem(IDC_RICHEDIT22)->SetWindowText("Hello");
//this line won't work:
//m_richEdit.SetWindowText("Hello there!"); <- richedit's handle is NULL
//this line will subclass m_richEdit
//plus run other initialization
CDialog::OnInitDialog();
//m_richEdit is ready
m_richEdit.SetWindowText("Hello there!");
return TRUE;
}
不需要额外的初始化
< > >代码> MyReHeDe< /Cuff>只是一个C++对象,声明为“代码> CRICHETCITRL MYRICHIT”;代码>这个C++类的构造函数除了设置<代码> MyHWND > >代码> null > />代码外,没有多大作用。p>
一旦它与一个有效的窗口句柄相关联,我们就可以开始使用它的windows方法,例如CRichEdit::SetWindowText
向导可能插入了以下代码:
void DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_RICHEDIT22, m_richEdit);
}
这告诉对话框将m_richEdit
与对话框控件IDC_RICHEDIT22
关联。但是只有基类方法CDialog::OnInitDialog()才能执行此关联代码>被调用
BOOL CMyDlg2::OnInitDialog()
{
//this line should work:
GetDlgItem(IDC_RICHEDIT22)->SetWindowText("Hello");
//this line won't work:
//m_richEdit.SetWindowText("Hello there!"); <- richedit's handle is NULL
//this line will subclass m_richEdit
//plus run other initialization
CDialog::OnInitDialog();
//m_richEdit is ready
m_richEdit.SetWindowText("Hello there!");
return TRUE;
}
不需要额外的初始化
< > >代码> MyReHeDe< /Cuff>只是一个C++对象,声明为“代码> CRICHETCITRL MYRICHIT”;代码>这个C++类的构造函数除了设置<代码> MyHWND > >代码> null > />代码外,没有多大作用。p>
一旦它与一个有效的窗口句柄相关联,我们就可以开始使用它的windows方法,例如CRichEdit::SetWindowText
mèu richEdit
将不会是NULL
,但它的窗口句柄将是NULL
,因为它还没有被创建为窗口。您必须首先调用默认方法。更改为:boolcmydlg2::OnInitDialog(){uu super::OnInitDialog();m_richEdit.SetWindowText(“你好!”);return TRUE;}
准确地说,richEdit窗口已经在CMyDlg2::OnInitDialog()
中创建,但它不会与m_richEdit
变量关联,除非基类的OnInitDialog()方法被调用。基本上像Barmak写的,但是<代码>·超~(/COD>)是微软特定的,我会写“代码> >对话::OnInITIOrAudio()/<代码>,这是标准C++。看起来你现在调用基类方法:代码> CyMdLG2::OnInITIAudio(){Cult::OnInIdiDeAudio();…} /Cube。不客气。m_richEdit
将不会为NULL
,但它的窗口句柄将为NULL
,因为它尚未创建为窗口。您必须首先调用默认方法。更改为:boolcmydlg2::OnInitDialog(){uu super::OnInitDialog();m_richEdit.SetWindowText(“你好!”);return TRUE;}
准确地说,richEdit窗口已经在CMyDlg2::OnInitDialog()
中创建,但它不会与m_richEdit
变量关联,除非基类的OnInitDialog()方法被调用。基本上像Barmak写的,但是<代码>·超~(/COD>)是微软特定的,我会写“代码> >对话::OnInITIOrAudio()/<代码>,这是标准C++。看起来你现在调用基类方法:代码> CyMdLG2::OnInITIAudio(){Cult::OnInIdiDeAudio();…} /Cube。不客气。请您解释一下为什么GetDlgItem(IDC_RICHEDIT22)->SetWindowText(“Hello”)代码>有效?我在编辑中添加了更多说明。现在明白了!感谢您的帮助、努力和时间。您能解释一下为什么GetDlgItem(IDC_RICHEDIT22)->SetWindowText(“Hello”)代码>有效?我在编辑中添加了更多说明。现在明白了!感谢您的帮助、努力和时间。