子对话框 – SetWindowTextA或SendMessageA崩溃程序 – MFC

错误:afxwin2.inl行165

我的应用程序是一个有几个编辑框的对话框。 一旦我点击button来评估input的信息,我想打开一个子对话框来显示结果。 我试图像这样重载DoModal():

//in the child dialog //.h CResultsDlg::CResultsDlg(CParentDlg *parent); virtual INT_PTR DoModal(float bmi); //.cpp CResultsDlg::CResultsDlg(CParentDlg *parent) : CDialogEx(CResultsDlg::IDD), _parent(parent) { //initializations } INT_PTR CResultsDlg::DoModal(float bmi) { m_sBMI.Format("%f", bmi); m_hBMI.SetWindowTextA(m_sBMI); //crashes !!!!!!!!!! m_hBMI.SendMessageA(WM_SETTEXT, 0, (LPARAM)"15.11"); //crashes !!!!!!!! // OnInitDialog(); //because this wasn't getting called at all return CDialogEx::DoModal(); } BOOL CResultsDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // __super::OnInitDialog(); //no difference... m_hBMI.SetWindowTextA("10.3"); //crashes !!! return true; // return TRUE unless you set the focus to a control } //in the parent dialog //.cpp void CParentDlg::OnBnClickedCalculate() { CResultsDlg childResultsDlg = this; childResultsDlg.DoModal(15.7); } 

m_hBMI是一个静态文本控件的句柄。 我testing了一个编辑框,但它仍然崩溃。 我明白,这可能与尚未创build的控件有关,但我尝试了我所知道的所有方法。

使用断点,我确认OnInitDialog不会被调用,除非我把它放在重载的DoModal函数中。 SetWindowText / SendMessage仍然在OnInitDialog中崩溃,同样的ASSERT错误。

如果我删除了所有的SetWindowText / SendMessage,那么子窗口确实会出现模式,但“结果”静态文本控件与我在对话框编辑器属性窗格中设置的文本相同。

谢谢 !!!!!

*更多详细信息* ———–

 void CResultsDlg::DoDataExchange(CDataExchange* pDX) // DDX/DDV support { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_BMI, m_fBMI); DDV_MinMaxFloat(pDX, m_fBMI, 0, 100); DDX_Control(pDX, IDC_BMI, m_hBMI); } 

Solutions Collecting From Web of "子对话框 – SetWindowTextA或SendMessageA崩溃程序 – MFC"

开始对话时的通常顺序是:

  • 你叫CDialog :: DoModal。
  • 对话窗口被创建。
  • 对话框的子控件被创建。
  • OnInitDialog被调用。
  • CDialog :: OnInitDialog调用DoDataExchange。
  • 您的DoDataExchange方法中有一个DDX_Control调用将子控件映射到成员变量。

请注意,成员变量只在该序列的末尾被初始化。 你之前试图使用它们,所以你会崩溃。

将初始化所需的值存储在成员变量中,并在DoDataExchange中处理。