键盘消息
- 键盘消息
- WM_KEYDOWN - 按键被按下时产生
- WM_KEYUP - 按键被放开时产生
注意:两个消息不一定一对一出现 - WM_SYSKEYDOWN - 系统键按下时产生 比如ALT、F10
- WM_SYSKEYUP - 系统键放开时产生
- WM_CHAR - 字符消息(TranslateMessage()函数发送)
- 消息参数
- 按键消息:
- WPARAM - 按键的Virtual Key(虚拟键码)
- LPARAM - 按键的参数,例如按下次数
- WM_CHAR消息:
- WPARAM - 输入的字符(ASC编码)
- LPARAM - 按键的相关参数
- 按键消息:
- 消息的使用
- KEYDOWN可以重复出现,KEYUP只能在按键松开时出现1次
- TranslateMessage在转换WM_KEYDOWN消息时,对于可见字符可以产生WM_CHAR,不可见字符无此消息。
- WM_KEYDOWN/UP的wParam是表示的按键
虚拟键码,WM_CHAR是表示输入的字符的ASC字符编码
鼠标消息
基本鼠标消息
WM_LBUTTONDOWN - 鼠标左键按下
WM_LBUTTONUP - 鼠标左键抬起
WM_RBUTTONDOWN - 鼠标右键按下
WM_RBUTTONUP - 鼠标右键抬起
WM_MOUSEMOVE - 鼠标移动消息* 参数 WPARAM - 其他按键的状态,例如Ctrl/Shift等 LPARAM - 鼠标的位置,窗口客户区坐标系。 LOWORD X坐标位置 HIWORD Y坐标位置 * 鼠标消息使用 一般情况鼠标按下/抬起成对出现。在鼠标移动过程中,会根据移动速度产生一系列的WM_MOUSEMOVE消息。
- 双击消息
WM_LBUTTONDBLCLK - 鼠标左键双击
WM_RBUTTONDBLCLK - 鼠标右键双击
- 消息参数
* WPARAM - 其他按键的状态,例如Ctrl/Shift等
* LPARAM - 鼠标的位置,窗口客户区坐标系。
* LOWORD X坐标位置
* HIWORD Y坐标位置 - 使用时需要在注册窗口类的时候添加
CS_DBLCLKS
风格。 - 消息产生顺序
以WM_LBUTTONDBLCLK为例:
* WM_LBUTTONDOWN
* WM_LBUTTONUP
* WM_LBUTTONDBLCLK
* WM_LBUTTONUP
- 滚轮消息
WM_MOUSEWHEEL - 鼠标滚轮消息(鼠标滚轮 WM_MOUSEWHEEL------头文件StdAfx.h中的#include <windows.h>头文件之前定义#define _WIN32_WINNT 0X400)
消息参数- WPARAM:
- LOWORD - 其他按键的状态
- HIWORD - 滚轮的偏移量,是120的倍数,通过正负值表示表示滚动方向。
正:向前滚动
负:向后滚动 - LPARAM:鼠标当前的位置,屏幕坐标系
LOWORD - X坐标
HIWORD - Y坐标 - 使用
通过偏移量,获取滚动的方向和倍数。
定时器消息
- 定时器消息(此定时器多用于刷新界面)
可以在程序中设置定时器,当到达时间
间隔时,定时器会向程序发送一个
WM_TIMER消息。
定时器的精度是毫秒,但是准确度很低。
例如设置时间间隔为1000ms,但是会在
非1000毫秒到达。
VOID CALLBACK TimerProc(
HWND hwnd, //
UINT uMsg, //
UINT idEvent, //
DWORD dwTime //当前定时器的时间 );
消息的参数
WPARAM - 定时器ID
LPARAM - 定时器处理函数的指针- 定时器使用
- 创建定时器
UINT SetTimer( HWND hWnd,//定时器窗口句柄,定时器触发了,并让该窗口的处理函数处理 UINT nIDEvent, //定时器ID UINT uElapse,//时间间隔。毫秒为单位,1000毫秒=1秒 TIMERPROC lpTimerFunc //定时器处理函数指针,程序员自己定义,系统调用 );创建成功,返回非0。
- 当lpTimerFunc为NULL使用窗口处理函数,做为定时器处理函数,
- 当lpTimerFunc不为NULL使用定时器处理函数处理定时器消息。
- 消息处理 WM_TIMER
- 关闭定时器
BOOL KillTimer( HWND hWnd,//定时器窗口句柄 UINT uIDEvent //定时器ID ); 附:GetClientRect 获取窗口客户区大小
综合示例:
绘制圆的函数
BOOL Ellipse(
HDC hdc, // dc句柄(BeginPaint的返回值)
int nLeftRect, // 左上角X坐标
int nTopRect, //左上角Y坐标
int nRightRect, //右下角X坐标
int nBottomRect //左右下角Y坐标
);
获取窗口边界
BOOL GetClientRect(
HWND hWnd, // 窗口句柄
LPRECT lpRect // 返回窗口边界的信息
);