MFC程序多窗口引起的激活和非激活问题
2015-05-22 08:55
661 查看
公司的项目一直都是基于MFC开发的,界面上面布满了各种各样的窗口,有时候就会出现一些奇怪的现象。我就是写了这么一篇文章来记录下自己遇到的奇怪现象。 1、在我的程序中,有一个CView的派生类窗口。上面有一些编辑框和下拉框。因为需求的原因,在我的编辑框失去焦点的时候要去保存编辑框中的文本。我处理了EN_KILLFOCUS消息,简要代码如下:
一切看上去好像都没啥问题,但是我单元测试的时候发现了一个小问题,就是在我点击编辑框的时候,OnEnKillfocus函数被调用了,我就纳闷为啥会这样,我以为是下拉框引出的问题,所以我并没有进一步研究。 后来经过一段时间以后,测试人员再次提出这里面有bug。我就又研究了下。终于这次发现了根本原因。原来在点击编辑框窗口的时候,会激发CView窗口的OnActivateView函数,代码如下:
但使我下决心记录这篇文章的不是这个问题,而是接下来的一个问题。 我公司项目里面用了 CodeJock界面库。通过用该界面库在我的程序里创建了几个tab页,tab页有三态效果(鼠标经过,按下,离开), 正常情况下显示没有原因,但是当我放大在缩小我的程序时,tab页的三态效果没有了。我也查了一下,发现界面库的一个处理函数的判断给过滤了。简要代码如下:
这个函数通过CWnd::FromHandle(hWnd)->IsTopParentActive()来判断顶层窗口是否处于激活状态,在我的程序中,窗口放大缩小的情况下,有一个Popup类型的dialog窗口,在OnSize,OnSizeing,OnMove,OnMoving处理函数中调用了BringWindowToTop。恰恰就是这个BringWindowToTop导致了dialog窗口被激活了,所以CWnd::FromHandle(hWnd)->IsTopParentActive()返回false,导致tab页状态没有被刷新。
今天决心我写第一篇来记录这两个问题是因为MFC多窗口程序中会出现很多奇怪的焦点,激活问题,提醒自己以后要多注意,同时也希望能给遇到同样困惑的朋友一点帮助。
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多窗口程序中会出现很多奇怪的焦点,激活问题,提醒自己以后要多注意,同时也希望能给遇到同样困惑的朋友一点帮助。
相关文章推荐
- vs2010 设置MFC程序窗口大小无效的问题
- 问题解决——MFC SDI程序 CFormView中控件随窗口缩放
- 用MFC编写的程序在别人电脑上显示时窗口界面出现问题
- 问题解决——MFC SDI程序 CFormView中控件随窗口缩放
- C++MFC程序窗口无法显示最大最小化按钮问题
- docablepane 可停靠窗口在使用过程中的问题小结 vc mfc
- 【问题解决】windows程序使用LaodImage加载图标无法显示在程序窗口标题栏
- windows/mfc 隐藏窗口接受消息的问题
- 在cmd启动一个MFC程序,printf把信息输出到启运它的那个CMD窗口
- MATLAB6.x & VC6.0: 将plot图片显示在MFC程序的窗口中--From energy's homepage
- VC2005中MFC程序的部署问题
- Visual Studio 2013 MFC基于对话框的程序中加入TeeChart控件后,编译时显示不能实例化抽象类的问题
- MFC程序解析命令行参数的相关问题:再灌水
- [转]MFC程序调出console窗口
- C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- VC++ MFC 多窗口操作问题·····
- MFC控件的不创建窗口也允许激活的选项查探
- 为MFC程序添加控制台窗口
- MFC窗口自动激活
- 激活后台运行程序的窗口