gpt4 book ai didi

c++ - MFC、EndDialog、重复创建对话框导致意外行为

转载 作者:行者123 更新时间:2023-11-28 03:24:53 26 4
gpt4 key购买 nike

我需要根据其大小动态调整对话框窗口。为此,我采用了以下技术:

  1. 我加载它并从 CDialog::OnInitDialog() 处理程序获取它的大小。

  2. 如果尺寸太大,我通过调用 CDialog::EndDialog 结束对话框

  3. 然后更新全局变量并重新初始化对话框派生类并调整大小。

发生的情况是,在第二次通过时,某些 API 开始表现异常。例如,MessageBox 不显示(因此所有 ASSERT 宏停止工作)并且一些 SetWindowText API 使应用程序崩溃。知道为什么吗?

以下是代码片段:

#define SPECIAL_VALUE -1
//From CWinApp-derived class
BOOL CWinAppDerivedClass::InitInstance()
{
//...

for(;;)
{
CDialogDerivedClass dlg(&nGlobalCounter);
m_pMainWnd = &dlg;
if(dlg.DoModal() != SPECIAL_VALUE)
break;
}

//...
}

然后从对话框类本身:

//From CDialogDerivedClass
BOOL CDialogDerivedClass::OnInitDialog()
{
//The following API shows message box only on the 1st pass, why?
::MessageBox(NULL, L"1", L"2", MB_OK);

//...

if(checkedDialogSizeIndicatesReload)
{
this->EndDialog(SPECIAL_VALUE);
return FALSE;
}

//Continue loading dialog as usual
...
}

编辑: 我偶然注意到,如果我注释掉以下行,它似乎会起作用。知道为什么吗?

//m_pMainWnd = &dlg;

最佳答案

变量dlg在你设置m_pMainWnd的地方还不是一个窗口(只有OnInitInstance返回TRUE后才会显示对话框);以下代码应该有效:

for(;;)
{
CDialogDerivedClass dlg(&nGlobalCounter);
// m_pMainWnd = &dlg;
if(dlg.DoModal() != SPECIAL_VALUE)
break;
}
m_pMainWnd = &dlg;

关于c++ - MFC、EndDialog、重复创建对话框导致意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14391173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com