消息
发送消息函数
消息
WM_CREATE : 窗口创建时的消息, 可以做一些初始化的操作, 一般我们在响应 WM_CREATE 消息时设置字体等初始化信息,注意这些变量应该设置为 static 类型,因为我们会在今后的不同消息中使用它们, lParam 指向 CREATESTRUCT 的结构体(LPCREATESTRUCT), 可以从该结构体中取出窗口句柄
WM_PAITNT : 重绘消息, 通过 Invalidate() 和 UpdateWindow() 等可以手动发送队列或非队列消息, 只会绘制无效区域
WM_DESTORY : 调用了DestroyWindow()之后, 默认PostQuitMessage(0) 发送 WM_QUIT 消息
WM_CLOSE : 用户点下关闭按钮时, 此时可以选择是否继续关闭窗口, 如果关闭, 可以调用DestroyWindow(), 该函数会发送 WM_DESTROY 的消息
WM_QUIT : 退出
WM_SIZE : 改变主窗口客户区大小时触发该消息 LOWROD(lParam), HIGHWORD(lParam), wParam 指出窗口的新状态
WM_MOVE : 当窗口相对于屏幕的坐标变化时,触发该消息
WM_SETFOCUS : 正在获得输入焦点
WM_KILLFOCUS : 正在失去输入焦点
SETTINGCHANGE : 当修改一些系统设置时,会触发该消息
WM_COMMAND : 相应子窗口控件消息
滚动条消息
WM_VSCROLL(垂直):
WM_HSCROLL(水平):
鼠标消息
流程:
确定鼠标消息的窗口,发送WM_NCHITTEST来确定到底是哪个部分(客户区/非客户区),确定参数,发送具体消息
只要有鼠标在窗口上经过/操作,都会有鼠标消息,不管有没有焦点、是否活跃等
lParam : 鼠标坐标信息
LOWORD() HIWORD()
wParam : 表示鼠标按钮、shift键、Ctrl键等的状态
case WM_LBUTTONDOWN:
if (wParam & MK_SHIFT)
{
if (wParam & MK_CONTROL)
{
MessageBox(NULL, TEXT("Control and Shift"), NULL, MB_OK);
}
}
客户区
WM_MOUSEMOVE : 鼠标移动, 当处理完一个鼠标移动消息时, 才会放入下一个, 并不是每移动一次都产生消息
WM_LBUTTONDOWN : 客户区左键按下消息
WM_RBUTTONDOWN : 客户区右键按下消息
WM_LBUTTONUP : 客户区右键抬起消息
WM_RBUTTONUP : 客户区左键抬起消息
// 当触发 WM_LBUTTONUP 消息时,该消息的 wParam 参数如果为 MK_RBUTTON 时,说明此时鼠标右键也被按下。
WM_LBUTTONDBLCIK : 左键双击
WM_MBUTTONDBLCIK : 中键双击
WM_RBUTTONDBLCIK : 右键双击
非客户区
lParam : 坐标 (使用屏幕坐标)
wParam : 用于表示非客户区鼠标移动或单击的位置 HT
WM_NCLBUTTONDOWN : 非客户区左键按下消息
WM_NCRBUTTONDOWN : 非客户区右键按下消息
WM_NCLBUTTONUP : 非客户区右键抬起消息
WM_NCRBUTTONUP : 非客户区左键抬起消息
WM_NCMOUSEMOVE :
WM_NCLBUTTONDBLCIK :
WM_NCMBUTTONDBLCIK :
WM_NCRBUTTONDBLCIK :
击中测试消息:
lParam : 坐标
wParam : 没用
WM_NCHITTEST : 优先级高于所有鼠标消息
鼠标滚轮消息
WM_MOUSEWHEEL :
lParam : 鼠标位置, 屏幕坐标
wParam : 低位表示一些按键的按下状态, 高位表示滚轮滚动的距离
WHEEL_DELTA : 滚动的距离是它的倍数
触发该消息时, 应该获取最新的滚轮设置
热点:鼠标指针指向的像素点 hot spot
单击
双击
需要在给窗口类赋值时加上 CS_CBLCLKS 风格
消息顺序是:单击消息--->双击消息
否则会产生两个单击的消息
拖动
LBUTTON、MBUTTON、RBUTTON
键盘消息
虚拟键代码:wParam, 对应的是 Ascii 或Unicode 字符码
lParam : 查看文档
击键消息
WM_KEYDOWN
WM_KEYUP
WM_SYSKEYDOWN
WM_SYSKEYUP
当收到一个虚拟键消息时,TranslateMessage() 会将消息翻译成字符(如果是可以显示的字符), 并发送字符消息
字符消息
WM_CHAR
WM_DEADCHAR : 死键, 当字符需要符号时
WM_SYSCHAR
WM_SYSDEADCHAR