Win32键盘消息与鼠标消息及插入标记

一、键盘消息

键盘消息分为系统键消息和非系统键消息。
系统键消息是指由Aft键和其他键组合而产生的按键消息。系统键消息应该交由Windows进行处理,用户所编制的程序一般不处理系统键消息,而是将这些消息交由DefWindowProc函数进行处理

1.字符消息:

系统字符消息:
WM_SYSCHAR----------------------系统字符
`WM_SYSDEADCHAR--------------系统死字符

非系统按键消息:
WM_CHAR----------------------------非系统字符
WM_DEADCHAR--------------------非系统死字符

2.按键消息:

系统按键消息:
WM_SYSKEYDOWN--------------系统按键按下时产生
`WM_SYSKEYUP-------------------系统弹起按下时产生

非系统按键消息:
WM_KEYDOWN------------键盘按键按下时产生
WM_KEYUP-----------------键盘按键弹起时产生

3.消息参数的含义(wParam和lParam)

按键消息:
wParam ------------- 按键的VirtualKey(虚拟键码)
lParam --------------- 按键的参数,如按下的次数

字符消息:
wParam -------------- 输入的字符(ASCII编码)
lParam ---------------- 按键的相关参数


二、鼠标消息

客户区使用的是客户区坐标系,而非客户区使用的是屏幕坐标系。

捕捉当前线程的鼠标: SetCapture(hwnd);
释放捕捉的鼠标: ReleaseCapture();
函数功能:就是绳套?,围着转跑不掉
在当前线程的指定窗口里设置鼠标捕获,一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内还是边界外。同一时刻只能有一个窗口捕获鼠标。SetCapture和ReleaseCapture必须成对出现,
失效条件:
当鼠标在其他窗口按下或调用ReleaseCapture释放。

1.客户区的鼠标消息

如果要处理双击消息,需要在创建窗口时加入CS|DBLCLKS

消息名称 消息含义 消息名称 消息含义
WM_LBUTTONDOWN 鼠标左键按下 WM_RBUTTONDOWN 鼠标右键按下
WM_LBUTTONUP 鼠标左键弹起 WM_RBUTTONUP 鼠标右键弹起
WM_LBUTTONDBLCLK 鼠标左键双击 WM_RBUTTONDBLICLK 鼠标右键双击
WM_RBUTTONDOWN 鼠标中键键按下 WM_RBUTTONUP 鼠标中键键按弹起
WM_MOUSEMOVE 鼠标移动消息 WM_MOUSEWHEEL 鼠标滚轮消息

消息参数:

wParam -------其他按键的状态,例如Ctrl键、Shift键等
lParam--------- 鼠标的X、Y坐标(客户区坐标系)

wParam参数的应用:
wParam & MK_LBUTTON 的值为TRUE ,表示左键处于被按下状态。
wParam & MK_MBUTTON 的值为TRUE ,表示中键处于被按下状态。
wParam & MK_RBUTTON 的值为TRUE ,表示右键处于被按下状态。
wParam & MK_SHIFT 的值为TRUE ,表示Shift 键处于被按下状态。
wParam & MK_CONTROT 的值为TRUE ,表示Ctrl 键处于被按下状态。

坐标获取:

// 推荐使用:
x = GET_X_LPARAM( lParam );  // 获取X坐标
y = GET_Y_LPARAM( lParam );  // 获取Y坐标

// 过去常用的:
x = LOWORD( lParam );       // 获取X坐标
y = HIWORD( lParam );       // 获取Y坐标

2.非客户区的鼠标消息

非客户区消息只是比客户区消息多个NC

消息名称 消息含义 消息名称 消息含义
WM_NCLBUTTONDOWN 鼠标左键按下 WM_NCRBUTTONDOWN 鼠标右键按下

消息参数:

wParam -------表示非客户区鼠标移动或单击位置。
lParam--------- 鼠标的X、Y坐标(屏幕坐标系)

wParam参数的应用:
wParam的值被设置为了一个“HT"开头的标识符,用于表示非客户区鼠标移动或单击位置。
HTCLOSE 表示 鼠标在关闭按钮上
HTCAPTION 表示鼠标在标题框中
HTMAXBUTTON 表示 鼠标在最大化按钮上
HTMINBUTTON 表示 鼠标在最小化按钮上

3.鼠标滚轮消息

消息参数:

lParam ------X、Y的坐标(屏幕坐标)
wParam------低字节:各个虚拟键是否按下;高字节:滚轮滚动的距离(WHEEL_DELTA=120的整数倍)。

x=GET_WHEEL_DELTA_WPARAM(wParam); // 滚动的距离
SytemparametersInfo函数能够查询和设置系统级参数。功能十分强大。


三、插入符号

就是输入文本是一闪一闪那个。
API函数: 成对使用

  1. 创建新的插入符号:CreateCaret
  2. 设置插入符号的位置:SetCaretPos
  3. 显示插入符号:ShowCaret
  4. 隐藏插入符号:HideCaret
  5. 销毁插入符号:DestroyCaret
  6. 显示光标:ShowCursor(FALSE多少次就需要TRUE多少次)
  7. 获取光标位置:GetCursorPos(屏幕坐标系)
  8. 设置光标位置:SetCursorPos(屏幕坐标系)

// 成对使用,能够用来判断窗口有无焦点,焦点就是插入出现的地方。
WM_SETFOCUS----------------一个窗口获得焦点
WM_KILLFOCUS -------------- 一个窗口失去焦点

//  创建新的插入符号
BOOL CreateCaret(HWND hWnd,      // 指定拥有插入标记的窗口
                  HBITMAP hBitmap,// 如果hBitmap为位图句柄,那么CreateCaret函数将忽略参数nWidth和nHeight,因为该位图定义了自己的宽度和高度
                  int nWidth,   // 按逻辑单位指定插入标记的宽度,如果该参数为零,那么宽度就设为系统定义的窗口边界宽度。如果hBitmap是位图句柄,那么函数CreateCaret忽略该参数。
                  int nHeight); // 按逻辑单位指定插入标记的高度。如果该参数为零,那么高度就设为系统定义的窗口边界高度如果hBitmap是位图句柄,那么函数CreateCaret忽略该参数。

// 设置插入符号的位置
BOOL SetCaretPos(int X,int Y);

// 显示插入符号
BOOL ShowCaret(HWND hWnd);  // 该函数使插入标记在屏幕的当前位置上可见。当插入标记变为可见时,它自动开始闪烁.

// 隐藏插入符号
B00L HideCaret(HWND hWnd);

// 销毁插入符号
BOOL DestroyCaret(VOLID);

//显示光标
int ShowCursor(BOOL bShow);// 如果bShow为TRUE,则显示计数器增加1,如果bShow为FALSE,则计数器减1。

// 获取光标位置
BOOL GetCursorPos(LPPOINT lpPoint);

// 设置光标位置
BOOL SetCursorPos(int X,int Y);

屏幕坐标与客户区坐标的转换:(其实就是对不同参考点而言的,实质没有改变)

// 屏幕坐标转换为客户区坐标
ScreenToClient(hwnd,&pt);     // pt为一个点的指针

// 客户区坐标转换为屏幕坐标
ClientToScreen(hwnd,&pt);     // pt为一个点的指针

今日一言:
步月登云,志在千里!

发布了30 篇原创文章 · 获赞 37 · 访问量 5499

猜你喜欢

转载自blog.csdn.net/qq_45021180/article/details/99708684
今日推荐