C++ 如何判断鼠标有没有在窗口上? 纯API 不是MFC
找了不少资料好像WM_MOUSELEAVE可以实现..不过我没有MSDN..我需要个WM_MOUSELEAVE实例比如MOUSE离开window,window的title...
找了不少资料 好像WM_MOUSELEAVE可以实现.. 不过我没有MSDN.. 我需要个WM_MOUSELEAVE实例 比如 MOUSE 离开 window ,window的title 改变成 "鼠标在窗口外" MOUSE回来title 改变成 "鼠标在窗口内" API 不是MFC
展开
6个回答
2018-10-23
展开全部
示例一:
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"鼠标经离开控件";
}
}
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"鼠标经离开控件";
}
}
2013-06-16
展开全部
函数功能:当在指定时间内鼠标指针离开或盘旋在一个窗口上时,此函数寄送消息。
函数原型:BOOL TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);
参数:
lpEventTrack;指向结构TRACKMOUSEEVENT的指针。
返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。
此函数能寄送如下消息:
WM_MOUSEHOVER:在上次调用TrackMouseEvent指定的时间里,鼠标盘旋在窗口的客户区。当此消息产生时,盘旋跟踪停止。如果需要进一步的鼠标盘旋跟踪,应用程序应当再次调用TrackMouseEvent。
WM_MOUSELEAVE:鼠标离开上次调用TrackMouseEvent时指定的窗口客户区。当此消息产生时,所有由TrackMouseEvent要求的跟踪都被取消。当鼠标再次进入窗口,并且要求进一步的鼠标盘旋跟踪时,应用程序必须调用TrackMouseEvent。
备注:当鼠标指针在指定时间内停留在指定矩形内,就被认为是处于盘旋状态。调用函数
SystemParameterslnfo并使用SPI_GETMOUSEAOVERWIDTH,SPI_GETMOUSEHOVERAEIGHT和
SFI_GETMOOSEAOVERTIME值来取得矩形的大小和时间。
速查:Windows NT 4.0及以上版本;Windows 98及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib。
函数原型:BOOL TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);
参数:
lpEventTrack;指向结构TRACKMOUSEEVENT的指针。
返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。
此函数能寄送如下消息:
WM_MOUSEHOVER:在上次调用TrackMouseEvent指定的时间里,鼠标盘旋在窗口的客户区。当此消息产生时,盘旋跟踪停止。如果需要进一步的鼠标盘旋跟踪,应用程序应当再次调用TrackMouseEvent。
WM_MOUSELEAVE:鼠标离开上次调用TrackMouseEvent时指定的窗口客户区。当此消息产生时,所有由TrackMouseEvent要求的跟踪都被取消。当鼠标再次进入窗口,并且要求进一步的鼠标盘旋跟踪时,应用程序必须调用TrackMouseEvent。
备注:当鼠标指针在指定时间内停留在指定矩形内,就被认为是处于盘旋状态。调用函数
SystemParameterslnfo并使用SPI_GETMOUSEAOVERWIDTH,SPI_GETMOUSEHOVERAEIGHT和
SFI_GETMOOSEAOVERTIME值来取得矩形的大小和时间。
速查:Windows NT 4.0及以上版本;Windows 98及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-06-16
展开全部
哈哈,都不给我发个链接,还好被我发现了。给你个代码片段:TRACKMOUSEEVENT tme = {0};
switch(uMsg)
{
case WM_MOUSEMOVE:
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = hwnd;
tme.dwHoverTime = 50; //鼠标在窗口上停留50毫秒时发送WM_MOUSEHOVER,可以改
TrackMouseEvent(&tme);
break;
case WM_MOUSELEAVE:
SetWindowText(hwnd,_T("MouseLeave"));
break;
case WM_MOUSEHOVER:
SetWindowText(hwnd,_T("MouseHover"));
break;
switch(uMsg)
{
case WM_MOUSEMOVE:
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = hwnd;
tme.dwHoverTime = 50; //鼠标在窗口上停留50毫秒时发送WM_MOUSEHOVER,可以改
TrackMouseEvent(&tme);
break;
case WM_MOUSELEAVE:
SetWindowText(hwnd,_T("MouseLeave"));
break;
case WM_MOUSEHOVER:
SetWindowText(hwnd,_T("MouseHover"));
break;
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-06-16
展开全部
可以用WM_MOUSEMOVE消息处理,因为OnMouseMove可以返回一个鼠标坐标,在判断IsPtInRect就可以了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-06-16
展开全部
WindowFromPoint 可以得到当前PT所在的窗口句柄.判断句柄就知道是不是在你的窗口中..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询