『VC++技术内幕』学习笔记(5)

2016-02-19 12:57 5 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐『VC++技术内幕』学习笔记(5),无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

     第五篇:基本事件处理

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

   我们已经知道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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

   该消息是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 ();
}

来源:http://www.tulaoshi.com/n/20160219/1602586.html

延伸阅读
第八章:使用ActiveX控件 1,ActiveX控件是一个直接插入到C++程序中的软件模块,以前常称OLE控件(OCX),是基于MS-COM技术。 2,ActiveX控件与普通Windows控件比较: 相同点:ActiveX控件也可看成是一个子窗口(可以看成这样的)。 如果想在对话框上加入ActiveX控件,则只要在对话框编辑器中,把ActiveX控件放在适当的位置上,并在资源模...
第六章:模式对话框和Windows通用控件 1,对话框也是窗口,它不当可以接受消息,而且还可以被移动和关闭,甚至可以在它的客户区中进行绘图操作。 2,模式对话框在被关闭之前,用户无法在同一应用程序的其它地方进行工作。模式对话框更易于编程。 无模式对话框在它仍保留在屏幕的同时,用户还可以在应用程序的其它窗口进行工作。 3,对话框...
第一章:Microsoft Windows 和 Visual C++ 1,Windows应用程序中一定要有WinMain函数,用来完成某些特殊的任务,其中最主要的是创建应用次序的主窗口。 2,DOS下,所有次序的目标模块在创建过程中都被静态连接起来。而Windows允许动态连接,即一些特定结构的库(DLL)可以在运行过程中被装入和连接,并且被多个应用程序共享。 3,项目是一些相...
第四章:基本事件处理、映射模式和滚动视图 1,消息映射:如在视窗中按下鼠标做键,会自动发送WM_LBUTTONDOWN消息,如果要对这消息有所反应的话,需 //{{AFX_MSG(CEx04aView)  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//头文件声明消息响应函数原型。 /
去年的时候,由于某种原因,我需要将一个文件的二进制形式以文本的格式输出到一个文本文件中,类似下面这个样子:   4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00   B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00...

经验教程

302

收藏

5
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部