适合医药公司做网站的图片,山西防疫最新信息,wordpress谷歌,网页制作网站建设公司之前写了[MFC] 消息映射机制的使用和原理浅析#xff0c;还有些需要补充的#xff0c;都记在这里。
MFC 消息的分类
MFC消息分为系统消息和自定义消息。 图片来源#xff1a;C语言/C教程 大型源码案例分析#xff1a;MFC消息系统的代码解析 易道云编程
系统消息分为窗口…之前写了[MFC] 消息映射机制的使用和原理浅析还有些需要补充的都记在这里。
MFC 消息的分类
MFC消息分为系统消息和自定义消息。 图片来源C语言/C教程 大型源码案例分析MFC消息系统的代码解析 易道云编程
系统消息分为窗口消息、命令消息、通知消息。消息ID是0 ~ 1023。 每个窗口的自定义消息的消息ID需要从1024开始。声明方法为
#define MY_MSG_1 (WM_USER 1)SendMessage
[MFC] 消息映射机制的使用和原理浅析中用SendMessage发了一个消息。
void CMFCApplication1Dlg::OnBnClickedButton1()
{::SendMessage(this-GetSafeHwnd(),MY_MSG_1,NULL,NULL);
}SendMessage发出的消息是不经过消息循环的。 所以debug时可以看到没有经过任何loop函数直接就是AfxWndProc了最终通过MessageMap找到对应的响应函数。 此时的函数堆栈调用 未排队的消息 未排队的消息会立即发送到目标窗口过程绕过系统消息队列和线程消息队列。 系统通常发送未排队的消息以通知窗口影响它的事件。 例如当用户激活新的应用程序窗口时系统会向窗口发送一系列消息包括 WM_ACTIVATE、 WM_SETFOCUS和 WM_SETCURSOR。 这些消息通知窗口已激活键盘输入已定向到窗口鼠标光标已在窗口边框内移动。 当应用程序调用某些系统函数时也可能导致未排队的消息。 例如在应用程序使用 SetWindowPos 函数移动窗口后系统会发送WM_WINDOWPOSCHANGED消息。 发送非排队消息的一些函数包括 BroadcastSystemMessage、 BroadcastSystemMessageEx、 SendMessage、 SendMessageTimeout 和 SendNotifyMessage。 来源关于消息和消息队列 PostMessage 和 消息循环
把上面的SendMessage改成PostMessage试一下。
void CMFCApplication1Dlg::OnBnClickedButton1()
{::PostMessage(this-GetSafeHwnd(),MY_MSG_1,NULL,NULL);
}此时的函数堆栈调用 可以看到调用堆栈不同。 在进入AfxWndProc之前进入了RunModalLoop。 RunModalLoop就是CWnd的消息循环处理函数。
所以用SendMessage发出的消息没有经过消息队列。 使用PostMessage发出的消息会进入系统的消息队列需要窗口的消息循环来处理。 线程可以使用 PostMessage 或 PostThreadMessage 函数将消息发布到其自己的消息队列或另一个线程的队列。 来源关于消息和消息队列 消息循环中主要做了以下事情 第一个循环
// phase1: check to see if we can do idle work
while (bIdle !::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
......PeekMessage 消息获取消息而不在队列中删除消息。 在这个消息中进行IDLE判断和处理。
第二个循环
// phase2: pump messages while available
do
{......
}while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));这个循环也是PeekMessage获取消息然后在循环体中进行pump meessage(消息泵)
// pump message, but quit on WM_QUIT
if (!AfxPumpMessage())AfxPumpMessage中会GetMessage()、AfxPreTranslateMessage()、TranslateMessage()、DispatchMessage()。
参考
C语言/C教程 大型源码案例分析MFC消息系统的代码解析 易道云编程
SendMessage() 发出的消息 PreTranslateMessage() 不一定能接收到!
关于消息和消息队列
MFC学习一MFC的消息循环 --讲解到位