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两个函数的功能。
有什么问题再交流。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)