MFC 对话框窗体冻结

Posted

技术标签:

【中文标题】MFC 对话框窗体冻结【英文标题】:MFC dialog form freezes 【发布时间】:2016-11-16 16:00:11 【问题描述】:

我有一个简单的 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
    

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

【问题讨论】:

【参考方案1】:

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

int userNotify ( CWnd *pParentWnd, int iNotificationType, char* pcNotificationText )

...
statusDlg->Create(StatusDlg::IDD, pParentWnd);
...

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

【讨论】:

以上是关于MFC 对话框窗体冻结的主要内容,如果未能解决你的问题,请参考以下文章

捕获托管在 mfc 对话框上的 windows 窗体事件(c#)

MFC获得主窗体和父窗体指针

所有应用程序顶部的 MFC 对话框窗体

VC/MFC 对话框工程中 主窗体与子窗体之间如何传值?

关闭c++MFC的主窗体,先弹出对话框询问“是不是要关闭”,点击确定取消按钮进行确认。

VC6.0中基于对话框的MFC EXE中的Tab Control控件如何使用???