MFC Windows程序设计学习笔记--鼠标和键盘

来源:互联网 发布:护眼台灯 知乎 编辑:程序博客网 时间:2024/05/18 02:12

设备驱动程序处理鼠标和键盘中断,将结果事件放在一系统范围队列中。

鼠标

1.
客户区鼠标消息:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_MBUTTONDBLCLK
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDBLCLK
WM_MOUSEMOVE

客户区鼠标响应函数具备一样的函数类型,参数列表形式:
(UINT nFlags, CPoint point)
uFlags:
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_CONTROL
MK_SHIFT
表示事件发生时相应键的状态

鼠标消息被发送到光标下面的窗口。
例外:
在接收鼠标按下消息后,将鼠标捕获CWnd::SetCapture。在鼠标松开后,释放CWnd::ReleaseCapture。在捕获过程中,鼠标消息都会发给捕获其的窗口处理。CWnd::GetCapture返回一个CWnd*,指向捕获鼠标窗口,没有窗口捕获或另一线程窗口捕获返回NULL。

一个键被快速单击两次:
含CS_DBLCLKS风格窗口收到:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP
对不含CS_DBLCLKS风格窗口收到:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDOWN
WM_LBUTTONUP

2.非客户区鼠标消息
WM_NCLBUTTONDOWN
WM_NCLBUTTONUP
WM_NCLBUTTONDBLCLK
WM_NCMBUTTONDOWN
WM_NCMBUTTONUP
WM_NCMBUTTONDBLCLK
WM_NCRBUTTONDOWN
WM_NCRBUTTONUP
WM_NCRBUTTONDBLCLK
WM_NCMOUSEMOVE

非客户区鼠标消息的响应函数,也具备同样的类型。参数列表形式为:
(UINT nHitTest, CPoint point)
point:这里为屏幕坐标。
nHitTest为事件发生位置的命中测试码。

测试码 命中位置 HTCAPTION 标题栏 HTCLOSE 关闭按钮 HTGROWBOX 还原按钮 HTHSCROLL 窗口的水平滚动栏 HTMENU 菜单栏 HTREDUCE 最小化按钮 HTSYSTEM 系统菜单 HTVSCROLL 窗口的垂直滚动条 HTZOOM 最大化按钮

3.其它
窗口在接收一个客户区或非客户区鼠标消息前,先收到光标的屏幕坐标和WM_NCHITTEST消息。
Windows处理WM_NCHITTEST消息时,根据光标屏幕坐标再产生一个客户区或非客户区鼠标消息。

执行一次,::TrackMouseEvent来设置鼠标离开或盘旋时,向窗口发送WM_MOUSELEAVE或WM_MOUSEHOVER消息。一次调用只会一次有效。须在#include

键盘

Windows将键盘消息送到带有 输入焦点的窗口。
CWnd::SetFocus/CWnd::GetFocus

1.击键消息
WM_KEYDOWN
WM_KEYUP
Alt,F10不产生此两消息。

Alt按下时,此后按下其它键会产生WM_SYSKEYDOWN,WM_SYSKEYUP.
F10按下,系统进入特殊模态:将下次击键看作菜单选择的快捷方式。
消息响应函数类型一致,参数列表:
(UINT nChar, UINT nRepCnt, UINT nFlags)
nChar:虚拟键代码
nRepCnt:重复次数
nFlags:

0-7 8 9-12 13 14 15 OEM扫描码,依赖硬件 扩展键标志 保留位 Alt按下位1,抬起为0 先前键按下为1,抬起为0 键被按下为1,抬起为0

对OEM扫描码,可用::MapVirtualKey转为虚拟键

虚拟键代码:
A-Z,a-z,0-9虚拟键代码和他们的ANSI码一样。
; [ ]没虚拟键代码

2.字符消息
::TranslateMessage将与字符键有关的击键消息转为WM_CHAR消息。
每个WM_CHAR包含一 与 ANSI或Unicode字符集中符号映射的字符代码。

(UINT nChar, UINT nRepCnt, UINT nFlags)
nChar:ANSI或Unicode字符代码
nRepCnt:重复次数
nFlags:

Alt按下时,产生WM_SYSCHAR消息。

3.插入符
CreateCaret
SetCaretPos/GetCaretPos
ShowCaret/HideCaret
::DestroyCaret

插入符被同一个线程内所有窗口共享

使用:
1.窗口收到输入焦点,创建。失去输入焦点,销毁。
2.可见性控制
3.绘制含插入符部分时,先隐藏,完成绘制,再显示。

0 0
原创粉丝点击