设为首页 加入收藏

TOP

Windows消息机制要点
2014-11-23 18:40:23 】 浏览:255
Tags:Windows 消息 机制 要点

  1. 窗口过程每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。(所以叫回调函数)


  2消息类型


  1)系统定义消息(System-Defined Messages)


  在SDK中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03ff]之间, 可以分为以下三类:


  1>窗口消息(Windows Message)


  与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,也可以是Dialog,控件等。


  如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...


  2>命令消息(Command Message)


  与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。


  WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。如果是控件, HIWORD(wParam)表示控件消息类型


  3>控件通知(Notify Message)


  控件通知消息, 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 可以任意扩展。


  2)程序定义消息(Application-Defined Messages)


  用户自定义的消息, 对于其范围有如下规定:WM_USER: 0x0400-0x7FFF  (ex. WM_USER+10) WM_APP(winver>4.0): 0x8000-0xBFFF (ex.WM_APP+4)


  RegisterWindowMessage: 0xC000-0xFFFF


  3消息队列(Message Queues)


  Windows中有两种类型的消息队列


  1)系统消息队列(System Message Queue)


  这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理


  2)线程消息队列(Thread-specific Message Queue)


  每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会创建,默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.注意:线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出(FIFO)的方式被处理。


  4队列消息(Queued Messages)和非队列消息(Non-Queued Messages)


  1)队列消息(Queued Messages)


  消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理如鼠标,键盘消息。


  2)非队列消息(NonQueued Messages)


  消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理


  如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED注意: postMessage发送的消息是队列消息,它会把消息Post到消息队列中; SendMessage发送的消息是非队列消息, 被直接送到窗口过程处理


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Huffman编码的实现 下一篇CString,int,string,char*之间的..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目