Chinaunix首页 | 论坛 | 博客
  • 博客访问: 642888
  • 博文数量: 133
  • 博客积分: 1566
  • 博客等级: 上尉
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-01 09:31
文章分类

全部博文(133)

文章存档

2019年(1)

2018年(1)

2017年(8)

2016年(9)

2015年(17)

2014年(4)

2013年(31)

2012年(25)

2011年(36)

2010年(1)

我的朋友

分类: C/C++

2012-12-09 23:03:27

1. 鼠标
1)鼠标信息分为两类:客户区消息和非客户区消息
   注:鼠标消息总是被发送到光标所在的窗口,比如:用户在A窗口按下鼠标左键,在B窗口释放鼠标左键,那么在A窗口会收到消息WM_LBUTTONDOWN,而在B窗口会收到WM_LBUTTONUP。
2)滚轮
   在鼠标滚轮滚动时,系统会不停发送WM_MOUSEWHEEL给接收窗口,窗口会调用类CScrollView中默认的消息处理函数。
3)鼠标捕获
   鼠标捕获就是窗口接收到鼠标按键按下消息后,在鼠标按键释放之前仍然可以接收鼠标消息,直到鼠标按键释放或者撤销鼠标捕获。鼠标捕获解决了窗口需要接收的鼠标消息在窗口外的问题
   MFC使用SetCapture来捕获鼠标,用ReleaseCapture撤销鼠标捕获
4)光标
   鼠标在屏幕上的显示。每个窗口都对应一个WNDCLASS结构:
typedef struct tagWNDCLASSW {
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbCl***tra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
里面定义了窗口类的基本属性,其中字段HCURSOR     hCursor保存了光标的句柄,该光标就是在窗口客户区上显示的样式。
    鼠标移动的处理过程:用户移动的鼠标->Windows系统通过重绘光标背景将光标从旧的位置清除->系统对光标所在窗口发送命中测试码WM_SETCURSOR消息->窗口调用消息响应函数::OnSetCursor判断光标所在区域,实现光标在新的位置呈现
 
2. 键盘
   用户按下或释放某个按键一下,就会产生一个中断,该中断激活键盘驱动程序KEYBOARD.DRV来对键盘中断进行处理,KEYBOARD.DRV程序会根据用户的不同操作进行编码,然后调用Windows用户模块USER.EXE生成键盘消息,并将该消息发送到消息队列中等候处理。
1)键盘消息,按下/释放
WM_KEYDOWNW---WM_KEYUP
WM_SYSKEYDOWNW---WM_SYSKEYUP
   击键消息分为系统击键消息和非系统击键消息。系统击键消息是指由Alt键和其他键组合而产生的按键消息以及操作按键F10产生消息。系统消息将交由Windows的函数DefWindowProc处理。如果用户要处理,应该在处理完这些消息后,再将其发送给函数DefWindowProc,以使Windows系统能够正常工作。
   除了系统击键消息以外的所有键盘消息都是非系统击键消息,用于应用程序窗口
   键盘字符消息:WM_CHAR/WM_SYSCHAR
   击键消息的处理函数:afx_msg void OnMsgName(UINT nChar, UINT nRepCnt, UINT nFlags)
MsgName可以是KEYDOWN, KEYUP,其中nChar,按键的虚拟键代码,nRepCnt按键重复的次数,nFlags包含按键扫描码和多个标志。
2)焦点
   鼠标消息-->向光标所在的窗口发送消息
   键盘消息-->向具有“输入焦点”的窗口发送消息
   通常情况下,具备输入焦点的窗口是活动应用程序的主窗口,也可能属于主窗口的子窗口或者对话框的编辑控件
   WM_SETFOCUS/WM_KILLFOCUS使得窗口获得或失去输入焦点
 
阅读(3087) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~