第7章鼠标和键盘

Download Report

Transcript 第7章鼠标和键盘

第7章 鼠标和键盘
本章主要内容
• 鼠标的客户区消息和非客户区消息的处
理
• 鼠标消息的捕获
• 处理键盘消息
7.1 处理鼠标消息
根据产生鼠标消息时
鼠标光标所处的位置,
鼠标消息分为两类:
客户区鼠标消息
非客户区鼠标消息
客户区
7.1 处理鼠标消息
1. 客户区鼠标消息
7.1 处理鼠标消息
• MFC中,鼠标消息响应函数的原型一般
为:
afx_msg void OnLButtonDown(
UINT nFlags, CPoint point );
掩码
产生鼠标消息时光标在窗
口客户区的位置
7.1 处理鼠标消息
例7-1 编写绘制矩形的应用程序,按下鼠标左键,矩形
左上角移动到鼠标位置,而当鼠标左键和shift键同时
按下时,矩形恢复原先位置。
Step 1
Step 2
Step 3
Step 4
7.1 处理鼠标消息
2. 非客户区鼠标消息
When:当光标处在应用程序窗口的标题栏、控制按钮以及窗口边框时
Remark:
 一般此类消息由默认处理函数进行响应,用户无需干涉
 要想捕捉(拦截)此类消息并进行处理,需要手工操作,VC++没有提
供便捷的处理宏
 消息处理由窗口框架类来捕获并响应,获取的是屏幕坐标系的坐标
WM_NCLBUTTO
NDOWN
= Windows
Message,
NonClient area
mouse Left
BUTTON DOWN
7.1 处理鼠标消息
2. 非用户区鼠标消息
例7-3:捕获WM_NCMOUSEMOVE消息
step 1:在CMainFrame中手工添加消息响应函数
afx_msg void OnNcMouseMove(UINT nHitTest, CPoint point);
step 2:再添加消息映射宏
ON_WM_NCMOUSEMOVE()
step 3:定义消息响应函数
void CMainFrame::OnNcMouseMove(UINT nHitTest, CPoint point)
{
CClientDC clientDC(this);
CString str = "";
str.Format("非用户区鼠标当前位置是: x = %d, y = %d
",
point.x, point.y);
clientDC.TextOut(20, 50, str);
CFrameWnd::OnNcMouseMove(nHitTest, point);
}
* 对比CView中的WM_MOUSEMOVE
7.1 处理鼠标消息
• 如果鼠标处在应用程序窗口之外,还希望可以
接受鼠标消息的话,则必须调用捕获鼠标消息
函数:
CWnd* SetCapture();
• 完成了所应该做的工作之后,应用程序应该及
时释放鼠标:
BOOL ReleaseCapture();
7.1 处理鼠标消息
3. 鼠标消息的捕获
例 7-4:使用SetCapture和ReleaseCapture
鼠标移出应用程序窗
口后,无法捕获鼠标
释放
7.2
处理键盘消息
Windows对每个按键定义了与设备无关的编码,
这种编码就叫做虚拟码。有了这个虚拟码,
Windows程序员就可以不必理睬扫描码,而使
用虚拟码来编写程序了。
扫描码
虚
拟
码
7.2
处理键盘消息
字符A~Z的虚拟码:’A’, ‘B’, …, ‘Z’ 注意大写,而且
不是VK_A, VK_B, …
数字0~9的虚拟码:’0’, ‘1’, …, ‘9’
例 7-5:虚拟码示例
7.2 处理键盘消息
2. 一般按键消息
常规情况下使用的按键消息
虚拟码或字符
的ASCII码
重复按键
的次数
组合含义,
详见表7-6
7.2 处理键盘消息
2. 一般按键消息
例 7-6: WM_CHAR消息的处理
注意字符大小写
的处理方法
7.3 应用程序窗口的焦点
在某个具体时刻只有一个窗口才能接收到键盘
消息,这样的窗口叫做具有输入焦点的窗口。
当应用程序的窗口获得输入焦点时,会发出
WM_SETFOCUS消息;而当窗口失去输入焦
点时,会发出WM_KILLFOCUS消息。
7.3 应用程序窗口的焦点
例 7-7:窗口焦点
WM_SETFOCU
S响应
WM_KILLFOCUS
响应