MFC学习笔记(2)—— 消息(1)

来源:互联网 发布:怎么登录ebsco数据库 编辑:程序博客网 时间:2024/06/16 05:57

Windows是基于消息的,应用程序的每一个动作都靠处理消息来进行。消息具体是什么?其实就是一堆以WM_开头的宏。


消息的分类:

1、标准消息(窗口消息):所有以“WM_”开头的消息都是标准消息,除了WM_COMMAND和WM_NOTIFY。

接收者是衍生自CWnd的类,例如CFrameWnd和CView。


2、命令消息:WM_COMMAND这类消息都是命令消息,发送者是UI对象,例如菜单、工具栏、加速键等等。

接收者可以使衍生自CCmdTarget的所有类,例如CWnd、CWinApp、CDocument。


3、控件消息(通知消息):WM_NOTIFY,顾名思义,是由控件发送的。接收者是它的父窗口。消息也通常为WM_COMMAND。


命令消息的响应顺序:虽然这四个类都可以响应命令消息,但是响应也分先后的。

CView——CDocument——CFrameWnd——CWinApp


自定义消息:

    发出自定义消息有两种方式:

PostMessage(UINT message,WPARAMA wp=0, LPARAMA lp=0);SendMessage(UINT message, WPARAMA wp=0, LPARAMA lp=0);

第一种:在应用程序空闲的时候发送,不进入消息队列,不是阻塞函数

第二中:立即发送,不进入消息队列,是阻塞函数,等消息处理完再往下执行

自定义消息的实现函数:

LRESULT  funName(WPARAM wp, LPARAM, lp)
    返回值是一个LRESULT,其实就是一个长整形,通常返回1l,返回0也可以。

自定义消息的消息映射:

ON_MESSAGE(MSG_ID, &fun)
第一个参数是消息的ID,也就是post和send的第一个参数,需要自己定义。第二个参数是实现函数的地址。


要想添加一个自定义消息,就要在三个部分添加代码——声明,实现,消息映射。这些可以添加在一个类里,也可以添加在两个类里。比如,要想在CView类里发送一个消息,实现放在CFrameWnd类里,这个消息的发送者就不能是Cview类隐式调用的this指针,而需要获得框架类的指针来调用,获得框架指针的方法有三种:


AfxGetMainWnd();GetParent();GetParentFrame();

同样的,想要框架类给视图类发送消息,就需要获得当前视图的指针:

GetActiveView();






0 0
原创粉丝点击