0

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

  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;
4

2 回答 2

1

InitDialog 是对话框窗口出现在屏幕上之前处理的最后一条消息 - 您可以检测和调整大小,而不是您正在做的那种时髦的全局变量。

if(checkedDialogSizeIndicatesReload)
    {
    // look up SetWindowPos - 
    // I am nt sure if there is another parameter or not that is optional
    int x,y,cx,cy;
    WINDOWPLACEMENT wp;
    GetWindowPlacement(&wp);
    // calc new size here
    SetWindowPos(this,x,y,cx,cy);
    }

// window appears when the message handler returns
于 2013-01-18T03:07:02.920 回答
1

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

for(;;)
{
    CDialogDerivedClass dlg(&nGlobalCounter);
//  m_pMainWnd = &dlg;
    if(dlg.DoModal() != SPECIAL_VALUE)
        break;
}
m_pMainWnd = &dlg;
于 2013-06-06T07:03:05.997 回答