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

来源:互联网 发布:zcash挖矿软件 编辑:程序博客网 时间:2024/06/06 07:00

介绍完了消息的种类和自定义消息的发送,下面再来介绍一下Windows的消息响应机制,以便于我们更好的理解消息,也为我们截获消息做准备。





消息首先进入系统的消息,然后进入响应应用程序的消息队列,进入应用程序唯一的消息循环。消息循环不停地接收消息,同时判断这个消息是不是退出消息,如果是就退出,不是就预处理,翻译并分发下去。随后到达全局的回调函数,也叫消息的入口点函数

AfxWndProc();AfxCallWndProc(); 

接着到达CWnd下的

WindowProc();然后

CWnd::OnWndMsg();CFrameWnd::OnCommand()CWnd::OnCommand();CFrameWnd::OnCmdMsg();
在这几个函数之后,就按照CView、CFrameWnd、CDocument、CWinApp的顺序依次响应。


截获消息:了解消息的流程

    1、截获命令消息:在CWnd::OnWndMsg() 这个函数之后处理的消息都是命令消息,所以只要重写CFrameWnd::OnCommand()这个函数,判断消息的ID,就可以达到截获的目的。


    2、截获标准消息:在CView或CFrameWnd类里重写父类CWnd::OnWndMsg()这个函数,判断消息,就可以截获。


    3、截获自定义消息,同理标准消息。

以上三个截获请注意:在哪个类里接收消息,就要在哪个类里截获。

   4、截获退出消息:这个有些麻烦,因为退出程序的时候发送了三个消息:WM_CLOSE、WM_DESTORY、WM_QUIT。因为在唯一的消息循环里已经判断了是否为退出消息,所以我们需要在这之前截获。

在CMainApp类中重写父类CThread::PumpMessage() 代码如下

BOOL CmsgApp::PumpMessage(){// TODO: 在此添加专用代码和/或调用基类MSG msg;//定义个消息结构体接收传来的消息if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)){if (msg.message == WM_QUIT)//接收的是quit{return FALSE;//直接退出}AfxPreTranslateMessage(&msg);//如果不是,预处理,翻译,分发消息::TranslateMessage(&msg);::DispatchMessage(&msg);}return CWinAppEx::PumpMessage();}
这就相当于自己重写了一个消息循环,是不是很cool?








0 0