C++ 在何处初始化另一个对话框上的富编辑控件?

C++ 在何处初始化另一个对话框上的富编辑控件?,c++,mfc,C++,Mfc,我有一个基于MFC对话框的应用程序,它有两个对话框:主对话框CMyDlg和第二个对话框CMyDlg2 在主对话框上,我添加了一个按钮“Go Dialog 2”。因此,我为按钮添加了一个处理程序,当单击按钮时,它会弹出第二个对话框。一切正常,但在第二个对话框中,我从工具箱中添加了一个丰富的编辑控件。我为它添加了一个变量。我还为第二个对话框添加了一个类 现在,如果我运行应用程序,我会得到对话框1,如果我按下“转到对话框2”,我会得到我想要的。但我需要在某个时候更改rich edit控件的字体,但我的

我有一个基于MFC对话框的应用程序,它有两个对话框:主对话框
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”)有效?我在编辑中添加了更多说明。现在明白了!感谢您的帮助、努力和时间。