当前位置:   article > 正文

窗口不能还原的解决办法_窗口向下还原出错

窗口向下还原出错

程序最小化后不能还原,一般原因是程序中至少存在一个Popup类型的窗口引起的,因为Popup类型的子窗口即使由于父窗口的隐藏而隐藏,其WS_VISIBLE属性仍然是可见的,当用户再次点击任务栏的程序图标时,Popup窗口会拦截系统(还原)消息,使主程序框架无法接收到系统消息,从而导致主程序无法正常还原。如果将其修改为Child类型的窗口,那么主程序的最小化和还原的功能就可以正常了。不过在实际项目中,往往就需要一个Popup类型的窗口作为子窗口(Popup类型的窗口也可以有父窗口),那么这又如何解决程序最小化后不能还原的问题呢?根据以上分析的原理,只要在主程序最小化时,相应也隐藏掉Popup窗口(ShowWindow(SW_HIDE)),这样系统消息就能够正确传递了;当主程序还原时,再将隐藏的Popup窗口显示出来,这样就既不影响程序的显示效果,又能解决问题了!具体方法如下:

    首先需要在主程序(如MainFrame)中拦截系统消息(响应最大化,最小化,还原,关闭等消息的地方)。其消息为WM_SYSCOMMAND.如在MainFrame.h头文件中加入afx_msg void OnSyscommand(UIND nID,LPARAM lParam);在MainFrame.cpp的BEGIN_MAP与END_MAP之间加入ON_WM_SYSCOMMAND,响应函数为

void CMainFrame::OnSyscommand(UIND nID,LPARAM lParam){}。

    其次根据系统消息对Popup窗口进行隐藏与显示操作,代码如下:

CWnd* m_pPopupWnd;/// Popup类型的窗口指针

void CMainFrame::OnSyscommand(UIND nID,LPARAM lParam)

{

    static BOOL s_bDialogVisible = FALSE;

    /// 如果是最小化消息

    if(SC_MINIMIZE == nID)

    {

       if(NULL != m_pPopupWnd && ::IsWindow(m_pPopupWnd->m_hWnd))

       {

          if(::IsWindowVisible(m_pPopupWnd->m_hWnd))

          {

             s_bDialogVisible = TRUE;

             /// 隐藏Popup类型窗口

             m_pPopupWnd->ShowWindow(SW_HIDE);

          }

       }

    }

    else   

    {

       if(NULL != m_pPopupWnd && ::IsWindow(m_pPopupWnd->m_hWnd))

       {

          if(TRUE == s_bDialogVisible)

          {

             s_bDialogVisible = FALSE;

             /// 显示Popup类型窗口

             m_pPopupWnd->ShowWindow(SW_SHOW);

          }

       }

    }

    CWnd::OnSyscommand(nID,lParam);

}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/95075
推荐阅读
  

闽ICP备14008679号