wm_mousehover不管用预期效果:当鼠标放到按钮上时候,按钮文字变成“mousehover",离开后变成"mouseleave"结果不管用了,只会显示”mouseleave"
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam); TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(TRACKMOUSEEVENT);
tme.dwFlags=TME_HOVER|TME_LEAVE;
tme.dwHoverTime=2000;
tme.hwndTrack=hDlg; HWND hOkButton=NULL; switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE; case WM_MOUSEMOVE: TrackMouseEvent(&tme);
break; case WM_MOUSEHOVER:
hOkButton=GetDlgItem(hDlg,IDOK);
SetWindowText(hOkButton,_T("mousehover"));
break; case WM_MOUSELEAVE:
hOkButton=GetDlgItem(hDlg,IDOK);
SetWindowText(hOkButton,_T("mouseleave")); break;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam); TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(TRACKMOUSEEVENT);
tme.dwFlags=TME_HOVER|TME_LEAVE;
tme.dwHoverTime=2000;
tme.hwndTrack=hDlg; HWND hOkButton=NULL; switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE; case WM_MOUSEMOVE: TrackMouseEvent(&tme);
break; case WM_MOUSEHOVER:
hOkButton=GetDlgItem(hDlg,IDOK);
SetWindowText(hOkButton,_T("mousehover"));
break; case WM_MOUSELEAVE:
hOkButton=GetDlgItem(hDlg,IDOK);
SetWindowText(hOkButton,_T("mouseleave")); break;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
解决方案 »
- 给无人的朋友加点分1
- 郁闷了 好不容易搞定了winio 以为爽了 可终究逃不过gameguard的魔掌
- 程序优化
- WM_PAINT消息处理和重绘奇怪问题[请高手解答,暂时无分,以后报答]
- 关于Bcg库的工具栏的问题!
- 对话框程序的界面锁定
- 怎样将程序里面的printf和cout语句的输出重定向到一个文件.智者进来
- DoDataExchange(CDataExchange* pDX)干什么用的?
- 请问是否知道有安装在掌上电脑的c++编译器
- how to find out the proxy config of the IE5.
- list control显示不全的问题
- 计算机图形学需要哪些数学做基础?
WM_MOUSEHOVER是用来实现像ToolTip那样的效果的,即停留一段时间才看到效果
楼主的代码设定了停留2秒时间才看到效果
1. wm_mousehover这代码却是不管用2. 诡异无比,你看到没有,我忘了return TRUE了,对于case WM_MOUSELEAVE,结果当鼠标一旦离开后,setwindowtext就成功了。似乎违背 对话框处理函数,一旦处理消息后,就必须return TRUE的规矩了。哪个老师,如有兴趣,可以新建一个win32工程,然后用我的代码替换about的窗口函数即可测试。
我就是用你的代码测试的,鼠标不要动,等2秒,按钮的文字就变成mousehover了2.并没有规定必须return TRUE,例如处理WM_PAINT一般都是return 0
老师你好,1.我理解错了,却是如你所说,其实我是想实现的功能:针对按钮的,进入按钮,按钮变字, 离开按钮,按钮变字。 skd和mfc差异挺大 ,似乎不能够在父窗口即about 里处理这种消息, 没有 mfc的那种所谓控件反射机制。sdk必须自己重新一个按钮窗口函数才行。
模式对话框和非模式对话框的DialogProc返回值的规定都是一样的吧:
Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message.我在#4楼也说错了,在DialogProc里处理WM_PAINT应该是return TRUE
只是MSDN里提到某些消息不一定是返回TRUE,需要根据情况而定:
.
只是 改变了 按钮 的 标题。
程序运行时把 鼠标 放 对话框外, 然后 在对话框 边上 移动鼠标,
按钮的标题 会 改变。
真到按钮上时 反而 不响应了 (鼠标始终在 对话框 内!)需要子类化按钮