C++ 如何判断鼠标有没有在窗口上? 纯API 不是MFC

C++ 如何判断鼠标有没有在窗口上? 纯API 不是MFC,第1张

示例一:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

TRACKMOUSEEVENT tme//定义触发鼠标事件结构

tme.cbSize = sizeof (TRACKMOUSEEVENT)//结构大小

tme.dwFlags = TME_HOVER | TME_LEAVE //鼠标停留/鼠标离开

tme.dwHoverTime = 300//延时300毫秒

tme.hwndTrack = hWnd //窗体句柄

switch (message) {

case WM_CREATE: //创建窗口消春碰数息

edt = CreateWindow(L"edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,115, 23, 120, 24, hWnd, (HMENU)IDB_EDIT, hInst, NULL)//edit编辑文本框

break

case WM_MOUSEMOVE :

//鼠标移动消息

TrackMouseEvent(&tme)//调用TrackMouseEvent函数,系统根据tme触发WM_MOUSEHOVER或WM_MOUSELEAVE消息

break

case WM_MOUSEHOVER: //鼠标停留消息(这不会自动触发,需要TrackMouseEvent函数来触发)

SetWindowText (edt, _T("鼠标在窗体上面"))

break

case WM_MOUSELEAVE : //鼠吵唯标离开消息(这不会自动触发,需要TrackMouseEvent函数来触发)

SetWindowText (edt, _T("鼠标已离开窗体"))

break

case WM_COMMAND :

break

default:

return DefWindowProc(hWnd,

message, wParam, lParam)

}

return 0

}

示例二:

示例一的WM_MOUSEHOVER、WM_MOUSELEAVE貌似只能对窗体有效果,对扒首窗体的子控件就没反应了;因此示例二演示如何实现对窗体上的控件也有效果

wchar_t* MouseHoL(HWND hWnd)//向前声明一个鼠标停留与离开函数

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){

TRACKMOUSEEVENT tme//定义触发鼠标事件结构

tme.cbSize = sizeof (TRACKMOUSEEVENT)//结构大小

tme.dwFlags = TME_HOVER | TME_LEAVE //鼠标停留/鼠标离开

tme.dwHoverTime = 100//延时100毫秒

tme.hwndTrack = hWnd //窗体句柄

switch (message) {

case WM_CREATE: //创建窗口消息

cbtn = CreateWindow(L"button", L"确定", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | WS_GROUP, 250, 20, 75, 30, hWnd, (HMENU)IDB_BTN,(HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL)//button按键

edt = CreateWindow(L"edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,115, 23, 120, 24, hWnd, (HMENU)IDB_EDIT, hInst, NULL)//edit编辑文本框

break

case WM_MOUSEMOVE :

//鼠标移动消息

TrackMouseEvent(&tme)//调用TrackMouseEvent函数,系统根据tme触发WM_MOUSEHOVER或WM_MOUSELEAVE消息

break

case WM_MOUSEHOVER: //鼠标停留消息(这不会自动触发,需要TrackMouseEvent函数来触发)

SetWindowText (edt, MouseHoL(cbtn))//调用MouseHoL函数,判断鼠标是否停留在cbtn窗口

break

case WM_MOUSELEAVE : //鼠标离开消息(这不会自动触发,需要TrackMouseEvent函数来触发)

SetWindowText (edt, MouseHoL(cbtn))//调用MouseHoL函数,判断鼠标是否离开cbtn窗口

break

case WM_COMMAND :

break

default:

return DefWindowProc(hWnd, message, wParam, lParam)

}

return 0

}

//定义鼠标停留或离开函数

wchar_t* MouseHoL(HWND hWnd) {

RECT cRC, winRC//控件屏幕位置RECT,控件窗口大小RECT

POINT Mxy,Cxy//鼠标坐标结构,控件坐标结构

GetCursorPos(&Mxy)//获取鼠标在屏幕的坐标

GetWindowRect(hWnd, &cRC)

//获取控件位于屏幕的位置及大小

GetClientRect(hWnd, &winRC)//获取控件的宽高

cRC.right = cRC.left + winRC.right//控件右下角的x坐标,也就是宽

cRC.bottom = cRC.top + winRC.bottom//控件右下角的y坐标,也就是高

if (Mxy.x >cRC.left &&Mxy.x <cRC.right &&Mxy.y >cRC.top &&Mxy.y <cRC.bottom) { //判断鼠标坐标是否在窗口内

return L"鼠标已进入控件"

}else {

return L"鼠标经离开控件"

}

}

WM_MOUSELEAVE和WM_MOUSEHOVER不是标准的Windows消息函数,它们不能通过类向导来添加,行旅所有的添加工作都需要通过手工输入代码来完成。

你可以先添加一个WM_MOUSEMOVE消息,看它生成了哪些代码,然后模仿。

其实手动添加WM_MOUSELEAVE和WM_MOUSEHOVER也不难汪颂。

1,在要相困带郑应这两个消息的类的头文件中加入

afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam)

afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam)

(其实就是函数原型声明)

2,在该类的源文件的消息映射(BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间)加入

ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)

ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)

3,源文件中实现OnMouseLeave和OnMouseHover两个函数的功能。

有什么问题再交流。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12215866.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存