上一次介绍了win32的消息机制, 这次主要介绍win32的消息机制之重要消息。
本次使用的开发环境是vs2013,使用的开发语言是C/C++, 创建的项目是win32项目
重要消息
1 窗口创建消息:WM_CREATE //窗口创建,类似c++的构造函数,由createwindow来产生,sendmessage发送
2 重绘消息 WM_PAINT
窗口接到wm_paint的消息的情况有两种:一、窗口最初创建;二、窗口出现无效区域
有4种情况窗口会出现无效区域:a、窗口移动后或大小改变后;b、窗口隐藏后重新显示,或者被其它窗口遮住了一部 分 ,这一部分重新可见;c、调用InvalidateRect(使矩形失效)InvalidateRgn(使区域 失效);d、调用ScrollWindow (滚动窗口)ScrollDC(滚动DC)3 定时器消息: WM_TIMER
SetTimer( hWnd, 2, 2000, TimerProc ); //设置定时器,第一个参数为窗口句柄
//第二个参数为定时器的ID,自己定义的ID
// 第三个参数为设置定时器的时间间隔(单位 ms)
//第四个参数为定时器的响应处理函数的函数指针
KillTimer(hWnd, 1); //关闭定时器,参数1 定时器所在的窗口句柄, 参数2 定时器的ID
4 WM_ACTIVATE://激活消息
window有激活消息,有3种情况会被发送(存放在wParam 参数里面)
1、通过鼠标单击激活了该窗口 ———— WA_CLICKACTIVE://鼠标激活
2、通过鼠标之外的工具,比如键盘激活窗口 ————WA_ACTIVE://非鼠标激活
3、取消该窗口的激活————WA_INACTIVE://非激活WM_SYSCOMMAND://系统命令消息
我们可以截获系统的消息然后进行处理(例如最大化, 最小化, 等)
具体的系统消息存储在wParam里面
例如
SC_CLOSE: 系统关闭消息
一.鼠标消息
1.1.鼠标左键消息
WM_LBUTTONDOWN 鼠标左键单击按下
WM_LBUTTONUP 鼠标左键单击弹起
WM_LBUTTONDBLCLK 鼠标左键双击
1.2.鼠标右键消息
WM_RBUTTONDOWN 鼠标右键按下
WM_RBUTTONUP 鼠标右键弹起
WM_RBUTTONDBLCLK 鼠标右键双击
1.3左键右键消息参数
(双击消息必须注册时加上CS_DBLCLKS)
WPARAM ---其他按键状态,例如CTRL/shift等
LPARAM-----鼠标的坐标系(客户区而言)
LOWORD----X坐标 HIWORD-------y坐标
1.4鼠标移动(滚轮)
WM_MOUSEMOVE 鼠标移动消息
WM_MOUSEWHEEL 鼠标滚轮消息
1.5滚轮消息参数
WPARAM:
LOWORD-----其他按键状态 HIWORD-----滚轮偏移(120倍数,向前为正)
LPARAM:
LOWORD ------x坐标 HIWORD----y坐标
二.键盘消息
2.1虚拟键码
在windows中,所有键盘的按键都被定义为一组通用的虚拟键码,所有键都视为虚拟键,每个键都对应的虚拟键码。(WINUSER.H定义)
VK_LEFT, VK_RIGHT,VK_ESC等(查看虚键码值表)
2.2普通键盘消息
Wm_KEYDOWN 键盘按下消息
WM_KEYUP 键盘弹起消息
附加参数作用:
WPARAM 按键的虚拟键码值
LPARAM 按键的参数(按下的次数等)
2.3系统按键消息
WM_SYSKEYDOWN 系统按键 F10 alt 和alt的组合键
Alt ---> vk_menu;
如果想构成alt + 组合键
直接在wm_syskeydown:消息下分支语句
Case ‘ h ’:即可。
WM_SYSKEYUP 系统键放下时消息
附加参数作用:
WPARAM 按键的虚拟键码值
LPARAM 按键的参数(按下的次数等
2.4字符消息
WM_CHAR 字符消息(当键盘按下可见字符时,先产生WM_KEYDOWN消息,TranslateMessage转换成WM_CHAR消息,)
附加参数作用
WPARAM 输入的字符
LPARAM 按键的相关信
三.定时器消息:
每过多少毫秒就相应一次,相当于时间上的循环处理
WM_TIMER消息(处理时间是毫秒,不准确)
WPARAM----定时器ID
LPARAM----定时器处理函数指针
定时器使用:
UINT_PTR SetTimer(HWND h,UINT nID,UINT time,TIMERPROC lp)
关闭定时器:
BOOL killTimer(HWND hWND,UNIT_PTR uIDEvent0);
四.重绘消息:
当窗口需要绘制的时候,会发送WM_PAIT消息给处理函数
Bool InvallidateRect(HWND hWnd,
const RECT* LpRect ,BOOL erase//重绘前是否删除)
WM_PAINT WPARAM---LPARAM参数无用
SendMessage(hWnd, WM_MYMESSAGE, 0, 0);