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;
}

解决方案 »

  1.   

    管用
    WM_MOUSEHOVER是用来实现像ToolTip那样的效果的,即停留一段时间才看到效果
    楼主的代码设定了停留2秒时间才看到效果
      

  2.   


    1. wm_mousehover这代码却是不管用2. 诡异无比,你看到没有,我忘了return TRUE了,对于case WM_MOUSELEAVE,结果当鼠标一旦离开后,setwindowtext就成功了。似乎违背 对话框处理函数,一旦处理消息后,就必须return TRUE的规矩了。哪个老师,如有兴趣,可以新建一个win32工程,然后用我的代码替换about的窗口函数即可测试。
      

  3.   

    1. WM_MOUSEHOVER 那代码是管用,#2楼我是试过了才回复了
    我就是用你的代码测试的,鼠标不要动,等2秒,按钮的文字就变成mousehover了2.并没有规定必须return TRUE,例如处理WM_PAINT一般都是return 0
      

  4.   

    If an application processes this message, it should return zero
      

  5.   


    老师你好,1.我理解错了,却是如你所说,其实我是想实现的功能:针对按钮的,进入按钮,按钮变字, 离开按钮,按钮变字。 skd和mfc差异挺大 ,似乎不能够在父窗口即about 里处理这种消息, 没有 mfc的那种所谓控件反射机制。sdk必须自己重新一个按钮窗口函数才行。
      

  6.   

    2. 对话框的窗口函数, 我的理解和你的理解差异非常大, 我其实是发帖过,特意问:对话框的窗口函数,是否return false/true.高手们都说,如果某个消息你处理了,而且想生效,当是非模式对话框的时候,就必须返回true.不处理的话,就返回false.让 系统就处理。。对于模式对话框,似乎没有定论。
      

  7.   


    模式对话框和非模式对话框的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,需要根据情况而定:
    .
      

  8.   

    你这是 对话框的 ‘Hover’ 和‘Leave’,与 按钮 毫无关系!
    只是 改变了 按钮 的 标题。
    程序运行时把 鼠标 放 对话框外, 然后 在对话框 边上 移动鼠标,
    按钮的标题 会 改变。
    真到按钮上时 反而 不响应了 (鼠标始终在 对话框 内!)需要子类化按钮