24鼠标与键盘消息及其响应Read.docx
- 文档编号:23439497
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:21
- 大小:31.96KB
24鼠标与键盘消息及其响应Read.docx
《24鼠标与键盘消息及其响应Read.docx》由会员分享,可在线阅读,更多相关《24鼠标与键盘消息及其响应Read.docx(21页珍藏版)》请在冰豆网上搜索。
24鼠标与键盘消息及其响应Read
2.4鼠标与键盘消息及其响应
Windows是一种基于消息的交互式GUI操作系统,用户的操作主要通过鼠标和键盘进行。
Windows利用消息来处理由用户操作所引发的鼠标和键盘事件,程序员通过在视图类中添加相应的消息响应函数,并编写具体响应代码来处理鼠标和键盘消息。
1.鼠标
1)鼠标事件与消息
鼠标事件指用户的鼠标操作,基本的鼠标操作有:
按下(press)和松开(release)鼠标键、单击(click)或双击(double-click)鼠标键、移动(move)或拖动(drag)鼠标,其中左鼠标键按下/松开、移动/拖动鼠标在编程中最常用。
大多数鼠标操作都有相对应的Windows消息。
按照鼠标事件发生时鼠标光标所处的窗口区域,可以把鼠标消息分成两类:
●客户区鼠标消息(ClientAreaMouseMessages):
鼠标光标位于窗口的客户区时所产生的鼠标消息
●非客户区鼠标消息(NonclientAreaMouseMessages):
鼠标光标位于窗口的非客户区(如边框、标题条、系统菜单图标、最大化/最小化/还原按钮、关闭按钮、菜单、工具条、滚动条、状态条)时所产生的鼠标消息
其中,只有客户区鼠标消息是常用的。
至于非客户区鼠标消息,除了Windows自己用于系统管理外一般很少使用。
在本课程中我们只讨论客户区鼠标消息及其处理。
对SDK编程必须将非客户区鼠标消息交给DefWindowProc函数处理。
鼠标事件与消息
事件
客户区鼠标消息
非客户区鼠标消息
双击左键
WM_LBUTTONDBLCLK
WM_NCLBUTTONDBLCLK
按下左键
WM_LBUTTONDOWN
WM_NCLBUTTONDOWN
释放左键
WM_LBUTTONUP
WM_NCLBUTTONUP
双击中键
WM_MBUTTONDBLCLK
WM_NCMBUTTONDBLCLK
按下中键
WM_MBUTTONDOWN
WM_NCMBUTTONDOWN
释放中键
WM_MBUTTONUP
WM_NCMBUTTONUP
鼠标移动
WM_MOUSEMOVE
WM_NCMOUSEMOVE
双击右键
WM_RBUTTONDBLCLK
WM_NCRBUTTONDBLCLK
按下右键
WM_RBUTTONDOWN
WM_NCRBUTTONDOWN
释放右键
WM_RBUTTONUP
WM_NCRBUTTONUP
因为有的鼠标没有中键,所以应用程序很少使用与中键有关的三个消息。
另外,双击的最大时间间隔可用下列函数获取或设置:
(缺省为500毫秒)
UINTGetDoubleClickTime(VOID);//返回间隔的毫秒数
BOOLSetDoubleClickTime(UINTuInterval);//若成功返回非0值
其中,uInterval为时间间隔值(毫秒数)。
2)响应鼠标消息
可以用MFC类向导为视图类或对话框类等CCmdTarget类的派生类添加鼠标消息响应函数。
如
afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);
afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);
afx_msgvoidOnLButtonDblClk(UINTnFlags,CPointpoint);
afx_msgvoidOnRButtonUp(UINTnFlags,CPointpoint);
其中的参数:
point为鼠标的位置坐标(相对于客户区的左上角)、nFlags为标记参数——可以为如下符号常量值(二进制位,可以用“与”来判断,用“或”来组合):
nFlags的取值
符号常量
数值
含义
MK_CONTROL
8
Ctrl键被按下
MK_LBUTTON
1
左鼠标键被按下
MK_MBUTTON
16
中鼠标键被按下
MK_RBUTTON
2
右鼠标键被按下
MK_SHIFT
4
Shift键被按下
每次当你添加一个消息(如WM_MOUSEMOVE)响应时,MFC类向导会做如下一系列工作:
●在头文件的类定义中,添加消息响应函数的原型,如
//Generatedmessagemapfunctions
protected:
//{{AFX_MSG(CMJSetView)
afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
●在代码文件(*.CPP)尾部,添加含缺省代码的消息响应函数体,如
voidCDrawView:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CView:
:
OnMouseMove(nFlags,point);
}
●在代码文件(*.CPP)头部,添加对应的消息映射宏,如
BEGIN_MESSAGE_MAP(CDrawView,CView)
//{{AFX_MSG_MAP(CMJSetView)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
3)单击和拖动
注意,在Windows的鼠标消息中,并没有单击和拖动消息。
编程中,单击操作一般用松开左鼠标键消息WM_LBUTTONUP来代替,如
voidCDrawView:
:
OnLButtonUp(UINTnFlags,CPointpoint){
......
CView:
:
OnLButtonUp(nFlags,point);
}
而拖动操作则在鼠标移动的消息响应中判断左鼠标键是否被按下来区分。
如
voidCDrawView:
:
OnMouseMove(UINTnFlags,CPointpoint){
if(nFlags&MK_LBUTTON){
......
}
CView:
:
OnMouseMove(nFlags,point);
}
4)捕捉鼠标
如果用户在客户区按下鼠标,拖动鼠标到客户区外后才释放鼠标,则应用程序得不到鼠标被释放的消息,可能会产生错误的响应操作。
为避免这种事情发生,可以调用CWnd类的成员函数SetCapture来捕捉鼠标,使得以后的鼠标消息都发给自己,而不论鼠标的光标是否在自己窗口的客户区。
当程序不再需要鼠标消息后,必须调用函数ReleaseCapture释放对鼠标的捕捉,从而使其他程序可以获得它自己的鼠标消息。
在窗口失去对鼠标的捕捉时,会收到Windows发送的WM_CAPTURECHANGED消息。
还可以调用CWnd类的成员函数GetCapture来获得当前捕捉鼠标的窗口的指针。
这些函数的原型如下:
CWnd*SetCapture();
BOOLReleaseCapture();
staticCWnd*PASCALGetCapture();
程序一般是在用户按下鼠标键时设置鼠标捕捉,而在用户释放鼠标键后释放鼠标捕捉。
如:
voidCDrawView:
:
OnLButtonDown(UINTnFlags,CPointpoint){
m_bLButtonDown=TRUE;
SetCapture();
......
CView:
:
OnLButtonDown(nFlags,point);
}
voidCDrawView:
:
OnLButtonUp(UINTnFlags,CPointpoint){
......
m_bLButtonDown=FALSE;
ReleaseCapture();
CView:
:
OnLButtonUp(nFlags,point);
}
2.键盘
与鼠标一样,当用户敲击键盘时,会产生键盘事件(keyboardevents)。
在MFC中,它们也是由消息、消息映射宏和消息响应函数来处理。
1)按键
Windows中的按键有两类:
●普通按键:
在拥有键盘输入焦点的窗口中,在没有按下Alt键时情况下,所按的各种(组合)键
●系统按键:
按下Alt键时的各种按键;或在没有任何拥有键盘输入焦点的窗口时,所按下的任意(组合)键
为了保证像Alt+F4(关闭窗口或操作系统)这样的系统命令能被正确的执行,Windows总是将系统按键所产生的各种键盘消息,发送给CWnd类的对应系统消息响应函数作默认处理。
2)输入焦点
由于Windows为多用户操作系统,正在运行的程序可能有多个。
对于鼠标,Windows可根据其当前光标位置之下的窗口是哪一个,来决定将鼠标消息发送给哪个窗口(设置了鼠标捕捉时除外)。
而对于键盘,只有拥有键盘输入焦点的窗口才能接收到Windows所发送的键盘消息。
通常情况下,拥有键盘输入焦点的窗口是当前被激活的窗口。
活动窗口(包括对话框、各种控件和图标)会被高亮显示。
窗口在获得或失去输入焦点时,会收到Windows发送的WM_SETFOCUS或WM_KILLFOCUS消息。
可在相应的响应函数OnSetFocus或OnKillFocus中加入自己的处理代码。
如
voidCDrawView:
:
OnSetFocus(CWnd*pOldWnd){
CView:
:
OnSetFocus(pOldWnd);
//TODO:
Addyourmessagehandlercodehere
......
}
也可以自己调用(全局)API函数SetFocus和GetFocus来设置和获得输入焦点:
HWNDSetFocus(HWNDhWnd);//hWnd为将获得输入焦点的窗口指针
//返回失去输入焦点的窗口指针
HWNDGetFocus(VOID);//返回拥有输入焦点的窗口指针
3)键盘消息
Windows中的键盘消息有两类:
●击键消息(keystrokemessages):
由键盘动作直接产生的消息,如键按下或释放
⏹普通击键消息:
WM_KEYDOWN、WM_KEYUP
⏹系统击键消息:
WM_SYSKEYDOWN、WM_SYSKEYUP
●字符消息(charactermessages):
由击键消息转化而产生的消息
⏹普通字符消息:
WM_CHAR
⏹系统字符消息:
WM_SYSCHAR
4)消息响应
普通的击键和字符消息WM_KEYDOWN、WM_KEYUP和WM_CHAR所对应的消息响应函数为:
afx_msgvoidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags);
afx_msgvoidOnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags);
afx_msgvoidOnChar(UINTnChar,UINTnRepCnt,UINTnFlags);
它们的输入参数都差不多,如:
●nRepCnt:
为按住键不放时,所产生的重复按键计数值,一般为1
●nFlags:
标志
⏹对OnChar,一般不用
⏹对OnKeyDown和OnKeyUp:
nFlags中各位的意义
位
意义
0~7
8位扫描码(值依赖于OEM)
8
为扩展键*时为1否则为0
9~10
没有使用
11~12
由Windows在内部使用
13
Alt键被按下时为1否则为0
14
键原来的状态(按下为1,松开为0)
15
转换状态(刚被按下/松开为0/1)
*扩展键:
指非基本键盘中的键,如Insert/Delete/Home/End/PageUp/PageDown、方向键、Windows键/应用键和数字键盘中的NumLock、/、Enter键等
●nChar:
⏹对OnKeyDown和OnKeyUp为不区分大小写的虚键码(virtual-keycode),如’0’、’A’、VK_F1、VK_LEFT等;
⏹对OnChar为ASCII字符码(charactercode)。
可以调用API函数GetKeyState:
SHORTGetKeyState(intnVirtKey);
来获得指定虚键的状态,当指定的键被按下时,返回值的高位为1;当指定的键被锁住时,返回值的低位为1。
例如
if(GetKeyState(VK_SHIFT)&1<<15)...;
if(GetKeyState(VK_CAPITAL)&1)...;
5)虚拟键表
虚拟键代码
键类别
键
代码值
键类别
键
代码值
字母
A
‘A’
控制
LeftWindows
VK_LWIN
┊
┊
NumLock
VK_NUMLOCK
Z
’Z’
PageDown
VK_NEXT
数字
(主键盘)
0)
‘0’
PageUp
VK_PRIOR
┊
┊
PrintScreen
SysRq
VK_SNAPSHOT
9(
’9’
RightWindows
VK_RWIN
数字
(数字键盘)
0Ins
VK_NUMPAD0
ScrollLock
VK_SCROLL
┊
┊
Shift
VK_SHIFT
9PgUp
VK_NUMPAD9
Tab
VK_TAB
功能
F1
VK_F1
符号
SpaceBar
VK_SPACE
┊
┊
+
VK_ADD
F12
VK_F12
-
VK_SUBTRACT
方向
↑
VK_UP
*
VK_MULTIPLY
↓
VK_DOWN
/
VK_DIVIDE
←
VK_LEFT
.Del
VK_DECIMAL
→
VK_RIGHT
;:
186/0xBA
控制
Alt
VK_MENU
=+
187/0xBB
Applications
VK_APPS
<
188/0xBC
Backspace
VK_BACK
-_
189/0xBD
CapsLock
VK_CAPITAL
.>
190/0xBE
Ctrl
VK_CONTROL
/?
191/0xBF
Delete
VK_DELETE
`~
192/0xC0
End
VK_END
[{
219/0xDB
Enter
VK_RETURN
\|
220/0xDC
Esc
VK_ESCAPE
]}
221/0xDD
Home
VK_HOME
‘“
222/0xDE
Insert
VK_INSERT
虚拟键编码(十六进制,按编码顺序排列)
编码
虚拟键
对应键
01
VK_LBUTTON
左鼠标钮
02
VK_RBUTTON
右鼠标钮
03
VK_CANCEL
Ctrl+Break处理
04
VK_MBUTTON
中鼠标钮
05
VK_XBUTTON1
Win2K/XP:
X1鼠标钮
06
VK_XBUTTON2
Win2K/XP:
X2鼠标钮
07
未定义
08
VK_BACK
BACKSPACE键
09
VK_TAB
Tab键
0A
保留
0B
保留
0C
VK_CLEAR
CLEAR键
0D
VK_RETURN
Enter键
0E
未定义
0F
未定义
10
VK_SHIFT
Shift键
11
VK_CONTROL
Ctrl键
12
VK_MENU
Alt键
13
VK_PAUSE
Pause键
14
VK_CAPITAL
CapsLock键
15
VK_KANA/VK_HANGUL
IME假名/悬挂模式
16
未定义
17
VK_JUNJA
IMEJunja模式
18
VK_FINAL
IME韵母模式
19
VK_HANJA/VK_KANJI
IMEHanja/日本汉字模式
1A
未定义
1B
VK_ESCAPE
Esc键
1C
VK_CONVERT
IME转换
1D
VK_NONCONVERT
IME无转换
1E
VK_ACCEPT
IME接受
1F
VK_MODECHANGE
IME模式改变请求
20
VK_SPACE
空格键
21
VK_PRIOR
PageUp键
22
VK_NEXT
PageDown键
23
VK_END
End键
24
VK_HOME
Home键
25
VK_LEFT
左方向键←
26
VK_UP
上方向键↑
27
VK_RIGHT
右方向键→
28
VK_DOWN
下方向键↓
29
VK_SELECT
选择键
2A
VK_PRINT
打印键
2B
VK_EXECUTE
执行键
2C
VK_SNAPSHOT
PrintScreen键
2D
VK_INSERT
Insert键
2E
VK_DELETE
Delete键
2F
VK_HELP
帮助键
30~39
0~9
0~9
3A~40
未定义
41~5A
A~Z
A~Z
5B
VK_LWIN
左Windows键
5C
VK_RWIN
右Windows键
5D
VK_APPS
应用程序键
5E
保留
5F
VK_SLEEP
计算机休眠键
60~69
VK_NUMPAD0~VK_NUMPAD9
数字键盘0~9键
6A
VK_MULTIPLY
乘键*
6B
VK_ADD
加键+
6C
VK_SEPARATOR
分隔键\
6D
VK_SUBTRACT
减键-
6E
VK_DECIMAL
小数键.
6F
VK_DIVIDE
除键/
70~87
VK_F1~VK_F24
F1~F24
88~8F
未指定
90
VK_NUMLOCK
NumLock键
91
VK_SCROLL
ScrollLock键
92~96
OEM特定
97~9F
未指定
A0
VK_LSHIFT
左Shift键
A1
VK_RSHIFT
右Shift键
A2
VK_LCONTROL
左Ctrl键
A3
VK_RCONTROL
右Ctrl键
A4
VK_LMENU
左菜单键
A5
VK_RMENU
右菜单键
A6
VK_BROWSER_BACK
Win2K/XP:
浏览器返回键
A7
VK_BROWSER_FORWARD
Win2K/XP:
浏览器前进键
A8
VK_BROWSER_REFRESH
Win2K/XP:
浏览器刷新键
A9
VK_BROWSER_STOP
Win2K/XP:
浏览器停止键
AA
VK_BROWSER_SEARCH
Win2K/XP:
浏览器搜索键
AB
VK_BROWSER_FAVORITES
Win2K/XP:
浏览器喜爱键
AC
VK_BROWSER_HOME
Win2K/XP:
浏览器开始与主页键
AD
VK_VOLUME_MUTE
Win2K/XP:
音量静音键
AE
VK_VOLUME_DOWN
Win2K/XP:
音量降低键
AF
VK_VOLUME_UP
Win2K/XP:
音量升高键
B0
VK_MEDIA_NEXT_TRACK
Win2K/XP:
下一曲目键
B1
VK_MEDIA_PREV_TRACK
Win2K/XP:
上一曲目键
B2
VK_MEDIA_STOP
Win2K/XP:
停止媒体键
B3
VK_MEDIA_PLAY_PAUSE
Win2K/XP:
播放/暂停媒体键
B4
VK_LAUNCH_MAIL
Win2K/XP:
开始邮寄键
B5
VK_LAUNCH_MEDIA_SELECT
Win2K/XP:
选择媒体键
B6
VK_LAUNCH_APP1
Win2K/XP:
开始应用程序1键
B7
VK_LAUNCH_APP2
Win2K/XP:
开始应用程序2键
B8~B9
保留
BA
VK_OEM_1
Win2K/XP:
US标准键盘的;:
键
BB
VK_OEM_PLUS
Win2K/XP:
+键
BC
VK_OEM_COMMA
Win2K/XP:
键
BD
VK_OEM_MINUS
Win2K/XP:
-键
BE
VK_OEM_PERIOD
Win2K/XP:
键
BF
VK_OEM_2
Win2K/XP:
US标准键盘的/?
键
C0
VK_OEM_3
Win2K/XP:
US标准键盘的`~键
C1~D7
保留
D8~DA
未指定
DB
VK_OEM_4
Win2K/XP:
US标准键盘的[{键
DC
VK_OEM_5
Win2K/XP:
US标准键盘的\|键
DD
VK_OEM_6
Win2K/XP:
US标准键盘的]}键
DE
VK_OEM_7
Win2K/XP:
US标准键盘的’”键
DF
VK_OEM_8
用于多种可变字符
E0
保留
E1
OEM特定
E2
VK_OEM_102
RT-102键盘上的尖括号键或\键
E3~E4
OEM特定
E5
VK_PROCESSKEY
IME过程键
E6
OEM特定
E7
VK_PACKET
Win2K/XP:
用于传递Unicode按键
E8
未指定
E9~F5
OEM特定
F6
VK_ATTN
Attn键
F7
VK_CRSEL
CrSel键
F8
VK_EXSEL
ExSel键
F9
VK_EREOF
清除EOF键
FA
VK_PLAY
播放键
FB
VK_ZOOM
缩放键
FC
VK_NONAME
保留
FD
VK_PA1
PA1键
FE
VK_OEM_CLEAR
清除键
FF
IME=InputMethodEditor输入方法编辑器
OEM=OriginalEquipmentManufacturer原始设备制造商
2.5光标
光标是一种具有热点(hotspot)的特殊位图资源(一般为32*32像素),用于表示鼠标的位置和操作的状态。
Windows的默认光标为指向左上方的箭头。
1.装入与设置光标
应用程序有时会设置和显示自己的光标,这需要调用SDK的API函数SetCursor和LoadCursor:
HCURSORSetCursor(//返回原来光标的指针
HCURSORhCursor//handletocurs
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 24 鼠标 键盘 消息 及其 响应 Read