【发布时间】:2013-01-18 01:35:03
【问题描述】:
我需要根据其大小动态调整对话窗口。为此,我采用了以下技术:
我加载它并从 CDialog::OnInitDialog() 处理程序中获取它的大小。
如果尺寸太大,我通过调用 CDialog::EndDialog 来结束对话框
然后更新全局变量并通过大小调整再次重新初始化对话框派生类。
发生的情况是,在第二次通过时,一些 API 开始出现异常行为。例如,MessageBox 不显示(因此所有 ASSERT 宏都停止工作)并且某些 SetWindowText API 使应用程序崩溃。知道为什么吗?
这里是sn-ps的代码:
#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;
【问题讨论】:
-
因为 m_pMainWnd 是主窗口。为了使您的方案正常工作,您最好提供另一个隐藏的 CWnd 作为主窗口。
-
我猜测并说这是因为 dlg 超出范围而留下了一个悬空指针。尝试在 DoModal 返回后将 m_pMainWnd 设置为 NULL。
-
@TheSteve:不,那不行。仅当我在上面的代码 sn-p 之后从
OnInitDialog中执行theApp.m_pMainWnd = this;时,它才有效。但它也可以通过简单地注释该行来工作。我仍然不清楚m_pMainWnd的目的,MSDN 也没有多大帮助......
标签: c++ windows winapi mfc dialog