我用gdi函数绘制了一个按钮,想鼠标放在按钮上时变色,于是在mousemove消息响应中加了Invalidate函数重绘改变颜色,当我一动鼠标时界面闪得很厉害~怎么可以鼠标动时不产生闪烁感??或者有其它方法实现这个功能吗(按钮只是一个长方形rectangle,我不用系统的按钮)??谢谢!! 

解决方案 »

  1.   

    BOOL CxxxxDlg::PreTranslateMessage(MSG* pMsg)  
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message==WM_MOUSEMOVE)
    {
    CRect rc(50,50,100,100);
    if(rc.PtInRect(pMsg->pt
       重绘颜色}
      

  2.   

    在mousemove消息响应中加了Invalidate函数, 是肯定一直闪的, mousemove响应一次你刷新一次。
      要实现这个功能你可以让鼠标在按钮范围内时, 设置状态 m_bInBtn = TRUE, 然后离开后重新设置为FALSE,  如果bInBtn == TRUE  你可以再设置一个变量m_bSetBKColor = TRUE;  鼠标移动到按钮内, 设置颜色后  将bSetBKColor  = FALSE, 这样 只有当bSetBKColor 和 bInBtn同时为TRUE时, 才invalidate 不知道说清楚没 
      

  3.   

    在OnMouseMove加入
    void CMyBmpButton::OnMouseMove(UINT nFlags, CPoint point) 
    {
    if (!m_bTrackLeave)
    {
    TRACKMOUSEEVENT mouseEvent;
    mouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
    mouseEvent.dwFlags = TME_LEAVE | TME_HOVER;
    mouseEvent.hwndTrack = this->GetSafeHwnd();
    mouseEvent.dwHoverTime = 50; // 设为0则取默认400ms

    _TrackMouseEvent(&mouseEvent);
    m_bTrackLeave = FALSE;
        } CButton::OnMouseMove(nFlags, point);
    }增加2个自定义消息响应
    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
    ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)//鼠标离开按钮
    LRESULT CMyBmpButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
    {
    ReFlash();

    return 0;   
    }//鼠标移动到按钮上
    LRESULT CMyBmpButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
    {
    if (!m_bHot)
    {
    m_bHot = TRUE; Invalidate();
    UpdateWindow(); return 0;
    }

    return 0;   
    }void CMyBmpButton::ReFlash()
    {
    if (m_bHot)
    {
    m_bHot = FALSE; Invalidate();
    UpdateWindow();

    return;
    }
    }
      

  4.   

    增加悬停 和 离开两个消息
    WM_MOUSEHOVER
    WM_MOUSELEAVE