荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Deny (孤苦伶仃一个人,哈哈), 信区: Program
标  题: 『VC++技术内幕』学习笔记(5)
发信站: 荔园晨风BBS站 (Tue Dec 25 19:59:05 2001), 转信

原作者姓名 雷神
文章原始出处 http://ai361.com.cn
正文
『VC++技术内幕』学习笔记(5)
第五篇:基本事件处理
我们已经知道MFC库应用程序框架调用CView视图类的虚函数OnDraw来完成屏幕显示
。其实CView和CWnd类包含了几百个成员函数,在MSDN中可以看到这些成员函数,
其中有许多On开头的,例如第二篇的例子就有一个OnLButtonDown,它们都是应用
程序框架响应各种事件所需调用的函数。OnDraw便是当窗口发生变化是被调用的,
OnLButtonDown是鼠标左键被按下时调用,还有OnKeyDown是键盘被按下时调用等等

当用户在视窗中按下鼠标左键时,Windows会自动发送WM_LBUTTONDOWN消息给该视
窗,当然你可以什么都不做象我们第3篇的例子一样,如果你想要让程序对此消息
做出反应就必须在视图类给出相应的函数,类似下面这样:
void CMyView::OnLButtonDown(UINT nFlags,CPoint point)
{
//做些事情的代码
}
还需要在类头文件包含相应的函数原型说明
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg只是说明该函数原型是针对消息映射函数。下一步在代码文件中还需要有
一个消息映射宏,作用是把OnLButtonDown函数和应用程序框架联系在一起。
BEGIN_MESSAGE_MAP(CMyView,CView)
ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()
最后在类库的头文件还需包含:
DECLARE_MESSAGE_MAP()
函数和Windows消息的对应关系可以从MSDN中找到在MSDN中索引输入(WM_
Messages)便会列出所有的Windows消息和消息控制函数原型。在实际的编程过程
中我们不可能全部都用手工的添加或编制消息控制函数。除了一些特殊的,我们一
般是借助Class Wizard来自动编制消息映射函数。这又是MFC应用程序框架比起
SDK来的有一个便捷的地方。
MFC库对140种windows消息直接提供了消息控制函数,并且我们还可以自己定义自
己的消息,下面列出的五种消息是我们应该特别注意的(MSDN上有更详细的内容)

WM_CREATE
该消息是Windows发给视图的第一个消息。当应用程序框架调用create函数时该消
息便会被发送,此时窗口还未创建完成,不可见,因此在消息控制函数OnCreate内
不能调用那些依赖窗口处于完全激活状态的Windows函数。如果需要可以在重载的
OnInitialUpdate函数内调用。不过注意在SDI应用程序OnInitialUpdate函数可能
被多次调用。
WM_CLOSE
当用户关闭窗口时,系统会发送WM_CLOSE消息。如果派生类重新定义了OnClose函
数,就可以完全控制关闭过程,可以将提醒用户存盘之类的工作放在这里完成。我
们可以通过重载

CDocument::SaveModified虚函数达到相同的目的。
WM_QUERYENDSESSION
从字面的意思看就可以看出,当用户退出Windows时,或者调用了ExitWindows 函
数时。Windows会发送WM_QUERYENDSESSION消息给所有的正在运行的应用程序,由
OnQueryEndSession消息映射函数对消息进行处理。在它之后应该是WM_ENDSESSION
 消息。
WM_DESTROY在Windows发送WM_CLOSE消息后,紧接着会发送WM_DESTROY消息,虽然
窗口已经Close但实际上并没有完全清除,在任务管理器中还可以看见应用程序的
进程(我想很多木马或病毒都是无窗口的程序,它们的做法是生成了已经活动状态
的窗口但不显示出来),利用这个消息控制函数便可以对依赖于当前窗口存在的东
西做清除工作,不过一定要注意,应该调用基类的OnDestroy函数,而不能在用户
自己的视图的OnDestroy函数中终止窗口的析构过程,终止析构过程应该在
OnClose函数中。
WM_NCDESTROY
当窗口被取消所发送的最后一个消息就是这个消息。我们可以在OnNcDestroy函数
中做一些不依赖该窗口是否处于活动状态的最后的处理工作,(我实在想不出还需
要做什么?那位朋友能给个例子),注意一定要调用基类中的OnNcDestroy函数。


我们可以做一个小恶作剧程序:当在窗口内单击鼠标右键(注意是右键)时退出所
有的正在运行的应用程序。
void CMy007View::OnDraw(CDC* pDC)
{
CMy007Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut (100,100,"请不要单击鼠标右键,否则后果自负!");
}
void CMy007View::OnRButtonDown(UINT nFlags, CPoint point)
{
::MessageBox (NULL,"你确定要这样做吗?","警告",1);
::ExitWindows ();
}
未完待续
下一篇:映射模式
正文完


--
Deny就要毕业了,^_^编程资料:1.201/study/my document/,也许有你要的东西╭──你?
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┤
├────你尽指着天上的星星☆说~~天天跑步引体向上───────┤
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┤
╰─你还说:我是一个乖孩子_      前  路  漫  漫  任  我  闯    ╱
                           ╲_︵_︵_︵_︵_︵_︵_︵_︵╱

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.201]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店