我在程序中通过CHtmlView类派生出CHtmlCtrl类,我想在程序中实现鼠标指针移入CHtmlCtrl浏览器窗口时进行一个操作,当鼠标指针离开CHtmlCtrl浏览器窗口时再进行另外的一个操作,怎样实现?

解决方案 »

  1.   

    WM_MOUSEMOVE消息表示鼠标进入窗口区域, WM_MOUSELEAVE表示鼠标离开窗口区域
    不过要注意,正常情况下WM_MOUSELEAVE消息不会发生,如果你要响应这个消息,必须在WM_MOUSEMOVE消息响应中调用TrackMouseEvent来生成鼠标离开的消息
      

  2.   

    谢谢楼上的回复,TrackMouseEvent我试过了,但是它对于CHtmlView似乎运行有点不太正常,调用以后我所用到的WM_MOUSEHOVER事件从来没有被触发过,虽然WM_MOUSELEAVE事件可以被触发,但是运行效果却不是我想象的那样。不知道是什么原因。是不是CHtmlView不能很好的支持TrackMouseEvent呢?我把TrackMouseEvent用到别的控件中却可以正常使用。
      

  3.   

    CHtmlView也是一个普通的窗口,应该能正确响应的
      

  4.   

    考虑另一种替代方案,设置一个定时器,捕捉鼠标位置,自己来判断是MouseHover还是MouseLeave
      

  5.   

    定时器很耗资源的,我的这个程序对这方面要求很严格的,但是看来也只有这样了,间隔时间设置为多少合适呢,我在想…
    如果能让CHtmlView也能正确响应MouseHover和MouseLeave就好了~~
      

  6.   

    OnMouseMove根本没进在
    BOOL CHtmlviewView::PreTranslateMessage(MSG* pMsg) 
    {
    if( WM_MOUSEMOVE == pMsg->message )
    {
    中算是试试
      

  7.   

    好像WM_MOUSEMOVE发到其它窗口了
      

  8.   

    必然发到其它窗口了嘛,第一次收到WM_MOUSEMOVE就捕获鼠标嘛SetCapture,然后再用上面那些办法就应该可以了,出窗口之后再释放鼠标。
      

  9.   

    (一),新建一个单文档工程HtmlCtrl,视图类基于CHtmlView。
    (二),在#include <afxwin.h>前,加一行代码#define   _WIN32_WINNT   0x0400  
    (三),在CHtmlCtrlView中增加一个成员变量:bool m_bMouseOver,并在构造函数中赋初值为false。
    (四),重写CHtmlCtrlView::PreTranslateMessage函数,代码如下:
    BOOL CHtmlCtrlView::PreTranslateMessage(MSG* pMsg) 
    {
    if( WM_MOUSEMOVE == pMsg->message )
    {
    if(!m_bMouseOver)   
    {   
    TRACE(_T("Mouse   enter\n"));   
    m_bMouseOver   =   TRUE;   

    TRACKMOUSEEVENT   tme;   
    tme.cbSize   =   sizeof(tme);   
    tme.dwFlags   =   TME_HOVER   |   TME_LEAVE;   
    tme.hwndTrack   =   pMsg->hwnd;   
    tme.dwHoverTime   =   HOVER_DEFAULT;   
    ::TrackMouseEvent(&tme);   
    }  
    }
    else if( WM_MOUSELEAVE == pMsg->message )
    {
    TRACE(_T("Mouse   Leave!\n"));   
    m_bMouseOver   =   FALSE;   
    }

    return CHtmlView::PreTranslateMessage(pMsg);
    }20分太少了啊,小伙子。
    适当加点分吧
      

  10.   

    (一),新建一个单文档工程HtmlCtrl,视图类基于CHtmlView。
    (二),在#include <afxwin.h>前,加一行代码#define   _WIN32_WINNT   0x0400  
    (三),在CHtmlCtrlView中增加一个成员变量:bool m_bMouseOver,并在构造函数中赋初值为false。
    (四),重写CHtmlCtrlView::PreTranslateMessage函数,代码如下:
    BOOL CHtmlCtrlView::PreTranslateMessage(MSG* pMsg) 
    {
    if( WM_MOUSEMOVE == pMsg->message )
    {
    if(!m_bMouseOver)   
    {   
    TRACE(_T("Mouse   enter\n"));   
    m_bMouseOver   =   TRUE;   

    TRACKMOUSEEVENT   tme;   
    tme.cbSize   =   sizeof(tme);   
    tme.dwFlags   =   TME_HOVER   |   TME_LEAVE;   
    tme.hwndTrack   =   pMsg->hwnd;   
    tme.dwHoverTime   =   HOVER_DEFAULT;   
    ::TrackMouseEvent(&tme);   
    }  
    }
    else if( WM_MOUSELEAVE == pMsg->message )
    {
    TRACE(_T("Mouse   Leave!\n"));   
    m_bMouseOver   =   FALSE;   
    }

    return CHtmlView::PreTranslateMessage(pMsg);
    }20分太少了啊,小伙子。
    适当加点分吧