本来问题是这样的,鼠标按下按钮,有一个状态,鼠标不放开在按钮内部移动,就响应了WM_MOUSEMOVE消息,就咩有按下的那个状态了,所以我加了一个标记,当按下按钮时,WM_MOUSEHOVER 里的内容就不执行。
  
   但现在问题又来了,鼠标点击按钮按下,不放开,然后从按钮上移开,为什么没有发送 WM_MOUSELEAVE 消息??   就是按下鼠标不放,鼠标离开按钮,按钮还是那个 WM_LBUTTONDOWN 里的那个状态。
  
   怎么实现按下鼠标移开按钮(不放开),按钮响应 WM_MOUSELEAVE 消息呢?
m_trackMou.cbSize = sizeof(m_trackMou);
m_trackMou.dwFlags = TME_LEAVE | TME_HOVER;
m_trackMou.dwHoverTime = 0;
m_trackMou.hwndTrack = TtheApp.theCon->hwndBut1; .....
switch ( butMessage )
{
case WM_MOUSEMOVE:
{
TrackMouseEvent(&(TtheApp.theCon->m_trackMou));
}
break; case WM_MOUSEHOVER:
{
 if( !TtheApp.theCon->IsDown ) 
BitBlt(::GetDC(hWnd), 0,0,80,30, TtheApp.theCon->m_hdcSrcHL,0,0,SRCCOPY);
}
break; case WM_MOUSELEAVE:
{
BitBlt(::GetDC(hWnd), 0,0,80,30, TtheApp.theCon->m_hdcSrcHL,0,30,SRCCOPY);
}
break; case WM_LBUTTONDOWN:
{
BitBlt(::GetDC(hWnd), 0,0,80,30, TtheApp.theCon->m_hdcSrcHL,0,60,SRCCOPY);
TtheApp.theCon->IsDown = true;
}
break;
case WM_LBUTTONUP:
{
BitBlt(::GetDC(hWnd), 0,0,80,30, TtheApp.theCon->m_hdcSrcHL,0,60,SRCCOPY);
TtheApp.theCon->IsDown = false;
}
break;。。

解决方案 »

  1.   

    怎么实现按下鼠标移开按钮(不放开),按钮响应 WM_MOUSELEAVE 消息呢?你自己试试,普通的按钮,就算按下鼠标(不放开)。。按钮照样响应这个消息。你的难道不响应????
      

  2.   


     确实没有响应啊,在WM_MOUSELEAVE 消息里加入 一个对话框MessageBox(hWnd, ("test!"), ("消息"), MB_OK);   如果按钮按下按钮不放开,然后鼠标移出按钮,对话框并没有弹出,当放下鼠标时,才弹出啊 啊
      

  3.   

    试试:
    case WM_LBUTTONDOWN:
    OutputDebugString("LBUTTONDOWN\n");
    PostMessage(hWnd, WM_CANCELMODE, 0, 0);
    break;
      

  4.   


      恩,没错,这个可以实现。  请问消息 WM_CANCELMODE 具体作用是怎么,?在网上找资料不清不楚
      

  5.   


      另外, 有哪位仁兄写过  Hover-Leave效果按钮,?  能否把代码共享出来?
      

  6.   

    WM_CANCELMODE 自带的help就有,就是取消focus,或Capture模式。