【问题标题】:MFC controlling an edit box in a nested dialog get assertion errorMFC 控制嵌套对话框中的编辑框获取断言错误
【发布时间】:2012-04-07 14:42:27
【问题描述】:

我正在尝试在嵌套对话框中设置编辑框,但程序在运行时崩溃。我进行了以下更改以与第二个对话框建立连接:

1) 在第一个对话框中创建第二类类型的成员变量(派生自 CDialog)

2) 在我拥有的 1s 类的 OnInitDialog() 中:

CRect rcDlg;
m_dDlgData.Create(CDialogData::IDD, this); // Create the second dialog
GetWindowRect(rcDlg);
m_dDlgData.SetWindowPos(NULL, 0, 0, rcDlg.Width(), rcDlg.Height(), SWP_NOZORDER); 

3) 在第二类中创建了一个 CEdit 变量,该变量是公共的,以便从第一类访问它。 4)在按钮的事件处理程序中(在第一个对话框中),我想让给定的编辑框(在第二个对话框中)只读,并在另一个事件处理程序中禁用只读属性。这是发生错误的代码:

  void CZad1SemovDlg::OnBedit() 
  {
    m_dDlgData.EGNReadOnly(true);//no problems here

    ///some code///

    if(m_dDlgData.DoModal() == IDOK)// <-- the error happens here
    {
    //more code
    }
  }

  bool CDialogData::EGNReadOnly(bool check)
  {
    m_cEGN.SetReadOnly(check);//here nothing strange happens, the variable is
                              //initialised
    return true;
  }

奇怪,控件和对话框变量已初始化,但是当我运行 DoModal() 方法时,程序崩溃了。错误是:调试断言失败! dlgcore.cpp 在第 492 行 请帮助,我现在正在为此苦苦挣扎,搜索了网络,但找不到原因。我没有包含整个代码,因为我认为它会太多,但是如果您希望我添加您认为我错过的功能,请告诉我,我会将其添加到线程中。我正在使用 MSVC2008

【问题讨论】:

    标签: visual-c++ mfc dialog controls nested


    【解决方案1】:

    当您调用 .DoModal() 时,它会尝试再次创建您已通过调用 m_dDlgData.Create() 创建的对话框。断言告诉您对话框已经创建。不要调用 DoModal(),而是调用 m_dDlgData.ShowWindow(SW_SHOW),它应该可以工作。但是,ShowWindow() 将无模式显示对话框,但它应该给你你想要的。

    编辑:为了实现您的目标,在 DlgData 类中添加一个 var 来指示编辑模式。在构造函数中,传递一个初始化器:

    class CDlgData
    {
      CDlgData( BOOL bEditMode );
      private BOOL m_bEditMode;
    }
    
    CDlgData::CDlgData(BOOL bEditMode)
    {
      m_bEditMode = bEditMode;
    }
    
    CDlgData::OnInitDialog(...)
    {
      ...
      if( m_bEditMode )
      {
        // Set the controls to whatever
        m_cEGN.SetReadOnly(TRUE);
      }
    }
    

    当需要显示时,调用即可:

    CDataDlg dlg(TRUE); // for editing or FALSE for add
    dlg.DoModal();
    

    这使您不会过多地了解对话框是如何实现“只读”的。

    希望对你有所帮助。

    【讨论】:

    • 没有这样的函数“Show()”,我想你的意思是 ShowWindow()。你知道如何初始化第二类中的CEdit控件吗?因为如果我不使用 Create() 手动创建对话框,则不会调用 OnInitDialog(),因此不会初始化 m_cEGN。
    • ShowWindow() 是正确的。 Create() 做所有事情,包括调用 OnInitDialog。为什么然后在 OnBedit() 上将其显示为模态窗口?
    • 我的意图是有两个按钮——新建和编辑,它们打开同一个对话框,但是当用编辑打开时,编辑框 m_cEGN 将是只读的。最后,特别是在制作过程中的一个想法,所以我认为编辑代码会更容易,而不是重写它。并设置来自事件处理程序的字段(在本例中为 OnBedit())。您知道使用 DoModal 将参数传递给创建的窗口进行创建的方法吗?
    猜你喜欢
    • 2011-08-22
    • 2011-09-06
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2015-07-17
    相关资源
    最近更新 更多