- 现在直接给出MFC程序执行顺序,但着重分析其运行机制和功能分析,其流程是“theApp全局对象定义->TestApp构造函数->WinMain函数”。在执行theApp对象的构造函数之前先执行CWinApp基类的构造函数,从而把我们自己创建的类和MFC类相关联起来了。
- 文档应用程序中,都有五个类,部分类名和工程名相关联。在MFC程序有且仅有一个从应用程序类(CWinApp)派生的类,而且仅有一个该派生类的实例化对象
每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle), 消息ID(Message ID), 和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。(所以叫回调函数)
- Windows内核维护着一个全局的系统消息队列;按照线程的不同,系统消息队列中的消息会分发到应用程序的UI线程的消息队列中;
- 应用程序的每一个UI线程都有自己的消息循环,会不停地从自己的消息队列取出消息,并发送给Windows窗体对象;
- Windows消息也可以分为队列消息和非队列消息。在队列消息中,消息会先保存在消息队列中,消息循环会从此队列中取出消息并分发到各窗口处理 如:WM_PAINT,WM_TIMER,WM_CREATE,WM_QUIT,以及鼠标,键盘消息等。在非队列消息中,消息会绕过系统消息队列和线程消息队列,直接发送到窗口过程进行处理 如:WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR,WM_WINDOWPOSCHANGED
-
线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出(FIFO)的方式被处理。
注意: postMessage发送的消息是队列消息,它会把消息Post到消息队列中; SendMessage发送的消息是非队列消息, 被直接送到窗口过程处理
- PostMessage:把消息放到指定窗口所在的线程消息队列中后立即返回。 PostThreadMessage:把消息放到指定线程的消息队列中后立即返回。
- SendMessage:直接把消息送到窗口过程处理, 处理完了才返回。
- PeekMessage会立即返回 可以保留消息
- GetMessage在有消息时返回 会删除消息
- TranslateMessage: 把一个virtual-key消息转化成字符消息(character message),并放到当前线程的消息队列中,消息循环下一次取出处理。
- TranslateAccelerator: 将快捷键对应到相应的菜单命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的WM_COMMAND 或WM_SYSCOMMAND消息, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口过程处理, 处理完后才会返回。
- 用户自定义消息
- 首先需要声明消息 #define WM_MESSAGE 0x200
- 声明消息响应函数 在文件中的说明
- 实现消息响应函数
- 消息映射到消息处理函数
本文参考自下面几篇文章
https://blog.csdn.net/huangguangzhi88/article/details/85368700