WM_ACTIVE的消息

原创 2007年09月27日 20:32:00

WM_ACTIVE的消息参数

wParam的低阶word指示窗口是被激活还是失去激活:

WA_ACTIVE,被鼠标点击以外的方法激活;

WA_CLICKACTIVE,由鼠标点击激活;

WA_INACTIVE,失去激活;

wParam的高阶word指示窗口是否被最小化;

非零表示最小化;

lPararm表示将激活的窗口句柄(WA_INACTIVE),或者将失去激活的窗口句柄(WA_CLICKACTIVE、WA_ACTIVE)。

在标准Windows消息处理的章节中,曾指出处理WM_ACTIVE消息时,先要调用一个函数_AfxHandleActivate,此函数的原型如下:

  static void AFXAPI _AfxHandleActivate(CWnd* pWnd,

  WPARAM nState,CWnd* pWndOther)

  其中:

  参数1是接收消息的窗口;

  参数2是窗口状态,为WM_ACTIVE的消息参数wParam;

  参数3是WM_ACTIVE的消息参数lParam表示的窗口。

  _AfxHandleActivate是MFC内部使用的函数,声明和实现均在WinCore.CPP文件中。实现如下:

  如果pWnd指向的窗口不是子窗口,而且pWnd和pWndOther窗口的顶级父窗口(TopLevelParent)不是同一窗口,则发送MFC定义的消息WM_ACTIVATETOPLEVEL给pWnd的顶级窗口,消息参数wParam是nState,消息参数lParam指向一个长度为二的数组,数组里存放pWnd和pWndOther所指窗口的句柄。否则,_AfxHandleActivate不作什么。

  从这里可以看出:只有顶层的主边框窗口能处理WM_ACTIVE消息,事实上,Windows系统只会给顶层的非子窗口发送WM_ACTIVE消息。

  WM_ACTIVATETOPLEVEL消息的处理

  CWnd及派生类CFrameWnd实现了对WM_ACTIVATETOPLEVEL消息的处理,分别解释如下:

  消息处理函数CWnd::OnActivateTopLevel如果失去激活,则取消工具栏的提示(TOOLTIP)。

  消息处理函数CFrameWnd::OnActivateTopLevel调用CWnd的OnActivateTopLevel;如果接收WM_ACTIVE消息的窗口是线程主窗口,则使得其活动的视窗口变成非活动的(OnActive(FALSE, pActiveView,pActiveView)。

  从这里可以知道,在顶层窗口接收到WM_ACTIVE消息后,MFC会进行一些固定的处理,然后才调用WM_ACTIVE消息处理函数。

  WM_ACTIVE消息的处理

  在_AfxHandleActivate和WM_ACTIVATETOPLEVEL消息处理完之后,才是对WM_ACTIVE的处理。CWnd和CFrameWnd都实现了消息处理。

  CWnd的消息处理函数:

  void CWnd::OnActive(UINT nState, CWnd* pWndOther, BOOL bMinimized)

  其中:

  参数1取值为WA_INACTIVE/WA_ACTIVE/WA_CLICKACTIVE;

  参数2指向激活或者失去激活的窗口,具体同WM_ACTIVE消息;

  参数3表示是否最小化。

  此函数的实现是调用Default(),作缺省处理。

  CFrameWnd的消息处理函数:

  void CFrameWnd::OnActive(UINT nState,CWnd* pWndOther, BOOL bMinimized)

  首先调用CWnd::OnActivate。

  如果活动视非空,消息是WA_ACTIVE/WA_CLICKACTIVE,并且不是最小化,则重新激活当前视,调用了以下函数:

  pActiveView->OnActiveView(TRUE,pActiveView,pActiveView);

  并且,如果活动视非空,通知它边框窗口状态的变化(激活/失去激活),调用以下函数:

  pActiveView->OnActivateFrame(nState, this)。

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

公司的项目一直都是基于MFC开发的,界面上面布满了各种各样的窗口,有时候就会出现一些奇怪的现象。我就是写了这么一篇文章来记录下自己遇到的奇怪现象。 1、在我的程序中,有一个CView的派生类窗口。上面...
  • u011644552
  • u011644552
  • 2015年05月22日 08:55
  • 1653

Windows Message 消息队列,消息循环,Post消息,Send消息

MessageQueue The system does not automatically create a messagequeue for each thread. Instead, the ...
  • yyw610879290
  • yyw610879290
  • 2014年09月30日 19:15
  • 1062

windows常用消息大全(系统消息、通告消息、用户消息)

附录A Windows 常用消息大全 表A-1  Windows消息分布 消息范围 说 明 0 ~ WM_USER – 1 ...
  • yunhaiC
  • yunhaiC
  • 2014年12月04日 09:57
  • 1206

active MQ ,消息队列

  • 2013年01月09日 11:28
  • 5.99MB
  • 下载

wm_nchittest消息演示

  • 2006年02月23日 09:05
  • 5KB
  • 下载

WM_PAINT 消息

  • 2016年08月06日 13:38
  • 17KB
  • 下载

WM_NOTIFY消息流程实例分析

  • 2012年10月10日 21:26
  • 856KB
  • 下载

Windows进程通信之消息和WM_COPYDATA

  • 2014年08月03日 22:40
  • 412KB
  • 下载

WIN32无边框窗体的缩放、移动与WM_NCHITTEST消息 源码

  • 2013年08月06日 09:12
  • 5.19MB
  • 下载

VC++ 中的所有WM_xxx 消息

  • 2011年01月15日 19:34
  • 21KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WM_ACTIVE的消息
举报原因:
原因补充:

(最多只允许输入30个字)