MFC对话框冻结

时间:2016-11-16 16:00:12

标签: visual-c++ mfc

我有简单的MFC对话框类型窗口,它调用外部dll函数,其中一个参数是回调函数。如果未创建回调函数,则会创建另一个对话框窗口,并使用函数参数:

中的信息更新标签
int userNotify ( int iNotificationType, char* pcNotificationText )
{

if(statusDlg)
    {
        if ( !(statusDlg->IsWindowVisible()) ) 
        {
            statusDlg->ShowWindow(SW_SHOW);
        }
        statusDlg->showNotification(iNotificationType,pcNotificationText);
    } else
    {

        statusDlg = new StatusDlg(NULL);
        statusDlg->Create(StatusDlg::IDD,CWnd::GetDesktopWindow());
        statusDlg->ShowWindow(SW_SHOW);
        statusDlg->showNotification(iNotificationType,pcNotificationText);
    }


 return 0;
}

statusDlg是全局变量,是一个非常简单的MFC对话框,带有一个静态标签。它有一个功能 - 它放在最顶层。

    BOOL StatusDlg::OnInitDialog()
    {
        staticStatus = (CStatic*)GetDlgItem(IDC_STATIC_TRN_STATUS_DIALOG);

...    
        SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);


        return TRUE;  // return TRUE  unless you set the focus to a control
    }

回调期间显示对话框,标签显示所需信息。但是,如果我尝试使用鼠标移动表单,它就像下图中的冻结一样,标签上的信息不再更新。为什么会这样?如何解决这个问题?

enter image description here

1 个答案:

答案 0 :(得分:0)

创建StatusDlg时,您可以将其作为桌面的父级。这很可能是错误的,并导致您以后的问题。第二个对话框的父级应该是调用它的主对话框。

int userNotify ( CWnd *pParentWnd, int iNotificationType, char* pcNotificationText )
{
...
statusDlg->Create(StatusDlg::IDD, pParentWnd);
...
}

当您调用this时,父窗口指针将只是userNotify指针。