我需要根据其大小动态调整对话框窗口。为此,我采用以下技术:
我加载它并从 CDialog::OnInitDialog() 处理程序中获取它的大小。
如果大小太大,我通过调用 CDialog::EndDialog 来结束对话框
然后更新全局变量并通过大小调整再次重新初始化对话框派生类。
发生的情况是,在第二次通过时,一些 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;