您的位置:首页 > 其它

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

2017-03-15 07:56 323 查看
设备驱动程序处理鼠标和键盘中断,将结果事件放在一系统范围队列中。

鼠标

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-789-12131415
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.绘制含插入符部分时,先隐藏,完成绘制,再显示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息