MFC教程(5)-- MFC对象的创建(2)
2010-03-25 20:33:44 来源:WEB开发网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)。
SDI流程的回顾
从InitialInstance开始,首先应用程序对象创建文档模板,文档模板创建文档对象、打开或创建文件;然后,文档模板创建边框窗口对象和边框窗口;接着边框窗口对象创建视对象和视窗口。这些创建是以应用程序的文档模板为中心进行的。在创建这些MFC对象的同时,建立了它们之间的关系。创建这些之后,进行初始化,激活主边框窗口,把边框窗口、视窗口显示出来。
这样,一个SDI应用程序就完成了启动过程,等待着用户的交互或者输入。
5.3.4节将在SDI程序启动流程的基础之上,介绍MDI应用程序的启动流程。两者的相同之处可以这样类比:创建SDI边框窗口、视、文档的过程和创建MDI文档边框窗口、视、文档的过程类似。不同之处主要表现在:主边框窗口的创建不一样;MDI有文档边框窗口的创建,SDI没有;SDI只能一个文档、一个视;MDI可能多文档、多个视。
更多精彩
赞助商链接