关于Windows消息与消息队列

    系统以消息的形式将输入传递给窗口过程。消息由系统和应用程序共同生成。系统在每个输入事件上生成一条消息ーー例如,当用户键入、移动鼠标或单击滚动条等控件时。系统还生成消息以响应应用程序带来的系统变化,例如应用程序更改系统字体资源池或调整其中一个窗口的大小。应用程序可以生成消息来指导自己的窗口执行任务或与其他应用程序中的窗口通信。


    消息参数指定处理消息时窗口过程使用的数据或数据位置。消息参数的含义和值取决于消息。消息参数可以包含整数、打包的位标志、指向包含其他数据的结构的指针等等。当消息不使用消息参数时,它们通常被设置为 NULL。窗口过程必须检查消息标识符,以确定如何解释消息参数。


Message Types 消息类型

消息分类

  • 普通消息

  • command消息(WM_COMMAND)

  • NOTIFY消息(WM_NOTIFY)

  • 键盘消息
    WM_KEYDOWN / WM_KEYUP
    说到这两个消息就不得不提到扫描码和虚拟码
    扫描码:键盘上的每个键都对应一个扫描码(硬件上),各厂商可能不一样。
    虚拟码:键盘的驱动程序会把扫描码转成虚拟码(与硬件无关)。
    区分大小写字母消息:
    WM_CHAR
    消息循环里面要用到TranslateAccelerator这个api才会发WM_CHAR消息

  • 鼠标消息
    WM_LBUTTONDOWN
    WM_RBUTTONDOWN
    WM_LBUTTONUP
    WM_RBUTTONUP

  • 定时器
    WM_TIMER

  • 绘制
    WM_PAINT

    • 会发送WM_PAINT消息的情况
      1.窗口由可见变为不可见,例如最小化恢复会发送,有窗口覆盖了,改变了窗口大小、滚动条滚动
      2.一些api会发送比如UpdateWindow、InvalidateRect。。。

  • 应用程序通常不要自己发送WM_PAINT消息,但是可以通过呼叫InvalidateRect使显示区域无效。

  • 可以调用函数ValidateRect将其变为有效

  • BeginPaint/EndPaint中内部就包含了这个重置无效区域的操作。

DC

1.首先要获取hdc,也就是DC的句柄

获取hdc有3个api使用
BeginPaint 和EndPaint为第一种,只能在WM_PAINT
他们会把无效区域改成有效区域,如果使用其他两种的话不会把无效区域改成有效区域,导致系统会一直调用WM_PAINT,导致闪烁。同时必须配合EndPaint使用,否则不会释放之前拿到的DC导致资源泄露

GetDc和ReleaseDC在任何地方都可以使用

GetWindowsDC 获取整个区域的DC包括非客户区域




转载请说明出处
草堂教程网 » 关于Windows消息与消息队列

发表评论

欢迎 访客 发表评论

一个纯粹的精品教程收录分享站点

查看演示 官网购买