所属类别:开发技术
文章作者:lovesunny
特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!
MFC消息映射与处理介绍大家好!我是小辉,不知前两篇文章你看了感觉怎样?在前两篇文章里我们主要了解了Widows程序和MFC程序的基本框架。我希望大家记住它。今天我们主要了解一下MFC程序的消息映射正文【1】Windows处理消息的方法:在第0篇中见到的while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}【2】MFC处理消息的方法:在第1篇见到的class CMyFrameWnd : public CFrameWnd{public:afx_msg void OnPaint() //重绘窗口内部的图形{CPaintDC paintDC(this);paintDC.TextOut(10,10,"小辉愿和大家一起进步!");}DECLARE_MESSAGE_MAP()//声明消息映射表};//消息映射表BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)ON_WM_PAINT()//响应WM_PAINT消息END_MESSAGE_MAP()【3】消息响应函数[afx_msg void OnPaint();]:即处理消息的函数。afx_msg只是将函数标记为消息响应函数,你把它去掉程序也可以正常运行,只不过是习惯的标记罢了!【4】当MFC程序要处理消息时,你要告诉MFC你要处理什么消息以及在什么位置出处理这些消息。为此我们声名了一个消息映射表DECLARE_MESSAGE_MAP()//声明消息映射表并填写了消息映射表//(填写)消息映射表BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)ON_WM_PAINT()//响应WM_PAINT消息END_MESSAGE_MAP()还好,我们使用AppWizard和ClassWizard创建应用程序时,他们哥俩帮我们做好了上面的事情(*AppWizard为我们创建了基本消息映射表,ClassWizard会根据需要给给消息映射表添加新的条目*):(A)在类的头文件中说明了消息映射表(DECLARE_MESSAGE_MAP())。(B)在类的头文件中说明了消息响应函数函数(afx_msg void OnPaint();)。(C)在类的实现文件中定义了消息映射表BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)ON_WM_PAINT()//响应WM_PAINT消息END_MESSAGE_MAP()消息映射表的作用是:通过它找到消息响应函数。(D)在类的实现文件中定义了消息响应函数。void CMFrameWnd::OnPaint() //重绘窗口内部的图形{CPaintDC paintDC(this);paintDC.TextOut(10,10,"小辉愿和大家一起进步!");}这些工作你也可以手动完成(如第1篇看到的,只不过在那一篇中我们把这些东西都放在了MyApp.cpp文件中,应该把声名放在".h"文件中,把实现放在".CPP"文件中,VC中就是这样管理每一个类的)!【5】MFC程序中消息的种类:(A)窗口消息(Window Message):这种消息一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。形式通常为WW_XXX(不包括WW_COMMAND)如:WM_CREATE,告诉窗口初始化自己。WM_PAINT,告诉窗口绘制自己。WM_MOUSEMOVE,告诉窗口鼠标移经它。(B)由控件和其它子窗口发送给父窗口的WW_COMMAND消息:这些消息中包括EN_CHANGE通知码,例如当用户在编辑框中键如文本或进行修改时,就会向系统发送一个带EN_CHANGE通知码的WM_COMMAND消息。(C)来自用户界面对象的WW_COMMAND消息:包括由菜单、工具栏按钮和快捷键这些用户界面对象发送的消息。【6】说了这么多是不是有些乱?我们需要记住的是消息发生时,通过消息映射表找到相应的消息响应函数对消息进行处理!记住这三个宏:DECLARE_MESSAGE_MAP()//声明消息映射表//消息映射表BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)END_MESSAGE_MAP()好了在了解了上面知识后,我们在昨天的程序中加入鼠标左键按下的消息及其消息响应函数://MyApp.cpp#include //必要的包含文件//主窗口类class CMyFrameWnd : public CFrameWnd{public:afx_msg void OnPaint() //重绘窗口内部的图形{CPaintDC paintDC(this);paintDC.TextOut(10,10,"请按下鼠标左键!");}afx_msg void OnLButtonDown(UINT nFlags, CPoint point){::AfxMessageBox("响应了鼠标左键消息!");}DECLARE_MESSAGE_MAP()//声明消息映射表};//消息映射表BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)ON_WM_PAINT()//响应WM_PAINT消息,将会调用OnPaint()ON_WM_LBUTTONDOWN() //响应鼠标左键按下消息,将会调用//OnLButtonDown(UINT nFlags, CPoint point)END_MESSAGE_MAP()//应用程序类class CMyApp : public CWinApp{public:CMyApp():CWinApp("我的应用程序!")//设定应用程序名称{}BOOL InitInstance(){CFrameWnd* MyFrame = new CMyFrameWnd; //产生主窗口对象m_pMainWnd = MyFrame;MyFrame->Create(NULL,"我的程序!");//建立主窗口MyFrame->ShowWindow(SW_SHOW);//显示主窗口MyFrame->UpdateWindow();return TRUE;}};CMyApp theApp; //应用程序对象好了,请大家按照上篇的方法运行一下修改后的程序,是不是已经响应了鼠标左键按下的消息。本文出自 51CTO.COM技术博客
相关信息· 令人烦恼的项目估算
· 如何在windows程序中读取bios内容
· Linux 下串口通信编程
· 动态嵌入式DLL木马发现与清除方法
32231
21499
