![]() |
|
||||||||||||||
| | 网站首页 | 数据库教程 | web编程 | 服务器 | 程序设计 | | ||
|
||
|
||||||
| VC++消息映射 | ||||||
作者:佚名 文章来源:不详 点击数: 更新时间:2007-9-12 ![]() |
||||||
|
在学习VC++的时候,大家都不可避免的用到消息映射。
首先要明白一个包含了消息处理的Windows程序是如何工作的。 一般来说一个包含了消息处理的Windows程序至少要包含两个函数 第一个: int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to divvious instance LPSTR lpCmdLine, // command line int nCmdShow // show state ); 第二个: long FAR PASCAL WndProc(HWND hWnd,WORD message,WORD wParam,LONG lParam); 我们不必纠缠程序实现的细节,只要明白在第一个函数WinMain中要注册WndProc函数,通俗一些的理解就是WinMain告诉Windows系统,听着,我知道你要产生很多消息,我这里有一个WndProc函数负责处理你传递来的各种消息。当然消息的格式都是系统规定好的。 其次要明白C++中是如何实现多态性的。 我们知道多态性实现的关键是晚绑定(或者称为后期绑定),其实质就是编译器并没有在编译期间指定调用函数的绝对地址,而是指定了某个类内部该函数的偏移地址。 为了实现上面的功能,编译器为我们作了手脚 1、 在每个带有虚函数的类中,编译器秘密放置了一个指针,称为Vpointer 2、 当系统运行时,为每个类创建一个VTABLE,其中包含了可以调用虚函数地址。 3、 Vpointer出始化,指向VTABLE,通过在Vtable中偏移,来找到正确的需要调用的函数地址。 然后是MFC对Window API进行的封装 当我们利用MFC框架开发程序的时候,尤其是开发界面应用程序的时候,必定要用到CWnd或者派生于CWnd的类。根据面向对象的设计原则,对于CWnd的一些通用函数,例如窗口大学改变(OnSize),窗口移动(OnMove),最好是在CWnd中声明为虚函数,然后在继承的类里面重载他们。但是,这样以来,每个相关的派生类都要有一个Vpointer和一套记录Vtable,而CWnd中通用函数是如此至多,CWnd的派生类也很多,必然会导致系统在运行是占用过多的资源(内存),这样显然是不合适的。 那么MFC是如何实现的呢? 答案就是在CWnd基类中尽可能的少用虚函数,采用消息映射机制来代替。 大家可以看一下CWnd的类中的函数,就会发现这一点。 CWnd::OnMove afx_msg void OnMove( int x, int y ); 上面这个函数就不是虚函数。 最后的问题消息映射是如何实现的呢? 用一句话说,就是利用宏定义来实现面向过程的消息处理。 例如在VC中有如下的消息映射宏。 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() //}}AFX_MSG_MAP ON_COMMAND(ID_FONT_DROPDOWN, DoNothing) END_MESSAGE_MAP() 经过编译后,代码被替换为如下形式(这只是作讲解,实际情况比这复杂得多): //BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) CMainFrame::newWndProc(...) { switch(...) { //{{AFX_MSG_MAP(CMainFrame) // ON_WM_CREATE() case(WM_CREATE): OnCreate(...); break; //}}AFX_MSG_MAP // ON_COMMAND(ID_FONT_DROPDOWN, DoNothing) case(WM_COMMAND): if(HIWORD(wP)==ID_FONT_DROPDOWN) { DoNothing(...); } break; //END_MESSAGE_MAP() } } 这样,VC++就消除了对部分虚拟函数的需要,从而节省了内存空间。 本文来源:http://blog.csdn.net/imliujie/archive/2007/08/24/1757110.aspx
|
||||||
| 文章录入:admin 责任编辑:admin | ||||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | ||||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 网站地图 | 管理登录 | | |||
|