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 <afxwin.h>//必要的包含文件

//主窗口类
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; //应用程序对象

好了,请大家按照上篇的方法运行一下修改后的程序,是不是已经响应了鼠标左键
按下的消息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值