您的位置:首页 > 其它

MFC程序多窗口引起的激活和非激活问题

2015-05-22 08:55 661 查看
公司的项目一直都是基于MFC开发的,界面上面布满了各种各样的窗口,有时候就会出现一些奇怪的现象。我就是写了这么一篇文章来记录下自己遇到的奇怪现象。 1、在我的程序中,有一个CView的派生类窗口。上面有一些编辑框和下拉框。因为需求的原因,在我的编辑框失去焦点的时候要去保存编辑框中的文本。我处理了EN_KILLFOCUS消息,简要代码如下:

BOOL CMaskEdit::OnEnKillfocus()
 { 
    ProcessKillFocus();
    return FALSE; 
 }


一切看上去好像都没啥问题,但是我单元测试的时候发现了一个小问题,就是在我点击编辑框的时候,OnEnKillfocus函数被调用了,我就纳闷为啥会这样,我以为是下拉框引出的问题,所以我并没有进一步研究。 后来经过一段时间以后,测试人员再次提出这里面有bug。我就又研究了下。终于这次发现了根本原因。原来在点击编辑框窗口的时候,会激发CView窗口的OnActivateView函数,代码如下:

void CTestView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
 {
   //系统默认是获取焦点,我们这里不去获取焦点,否则答题卡编辑区域会出现异常
 }


但使我下决心记录这篇文章的不是这个问题,而是接下来的一个问题。 我公司项目里面用了 CodeJock界面库。通过用该界面库在我的程序里创建了几个tab页,tab页有三态效果(鼠标经过,按下,离开), 正常情况下显示没有原因,但是当我放大在缩小我的程序时,tab页的三态效果没有了。我也查了一下,发现界面库的一个处理函数的判断给过滤了。简要代码如下:

void CXTPTabManager::PerformMouseMove(HWND hWnd, CPoint pt)
{
     CXTPTabPaintManager::CAppearanceSet* pAppearance = GetPaintManager()->GetAppearanceSet();
     if (/*!CWnd::FromHandle(hWnd)->IsTopParentActive() ||*/ IsMouseLocked())
         {
             if (m_pHighlighted)
                 {
                       CRect rcRedraw(pAppearance->GetButtonDrawRect(m_pHighlighted));
                       m_pHighlighted = NULL;RedrawControl(rcRedraw, TRUE);
                 }
               return;
          } 
   //其他不相关的代码就不贴了
}


这个函数通过CWnd::FromHandle(hWnd)->IsTopParentActive()来判断顶层窗口是否处于激活状态,在我的程序中,窗口放大缩小的情况下,有一个Popup类型的dialog窗口,在OnSize,OnSizeing,OnMove,OnMoving处理函数中调用了BringWindowToTop。恰恰就是这个BringWindowToTop导致了dialog窗口被激活了,所以CWnd::FromHandle(hWnd)->IsTopParentActive()返回false,导致tab页状态没有被刷新。
今天决心我写第一篇来记录这两个问题是因为MFC多窗口程序中会出现很多奇怪的焦点,激活问题,提醒自己以后要多注意,同时也希望能给遇到同样困惑的朋友一点帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: