我想做个半透明的按钮可以调节alpha值的按钮。 我想实现的功能是,按钮默认为半透明状态,鼠标移动到按钮上,按钮变为不透明状态,离开按钮后,按钮在变为半透明状态。。现在的问题是,首次启动程序,按钮为半透明状态,触发hover消息后,按钮变为不透明,离开按钮后,按钮依然不透明,半透和不透重叠在了一起,我也调用刷新函数了。 不知道问题出在哪里。我贴出几个函数,大家帮我看看,谢谢了!重写的按钮类,继承的bitmapbutton类void CHoverButtonEx::OnMouseMove(UINT nFlags, CPoint point)  
{
// TODO: Add your message handler code here and/or call default
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE|TME_HOVER;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&tme);
m_point = point;
}
CBitmapButton::OnMouseMove(nFlags, point);
}
//画透明的位图
void CHoverButtonEx::DrawTransparentBitmap(CDC* pDC, int x, int y,int w, int h,CDC* memDC,
  int xSource, // = 0
  int ySource,int alphavalue) // = 0)
{   BLENDFUNCTION bm;
memset(&bm,0,sizeof(bm));
bm.BlendOp=AC_SRC_OVER;
bm.BlendFlags=0;
bm.SourceConstantAlpha = m_nalphaValue;
TRACE("%d\n",m_nalphaValue);
bm.AlphaFormat=0;   
AlphaBlend(*pDC,x,y,w,h,*memDC,xSource,ySource,w,h,bm);  }
//鼠标碰撞到按钮
LRESULT CHoverButtonEx::OnMouseHover(WPARAM wparam, LPARAM lparam)  
{m_bHover=TRUE;Invalidate();return 0;
}
//鼠标离开按钮
LRESULT CHoverButtonEx::OnMouseLeave(WPARAM wparam, LPARAM lparam)
{
m_bTracking = FALSE;
m_bHover=FALSE;
Invalidate();
return 0;
}void CHoverButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  
{
if ((m_ButtonSize.cx == 0) || (m_ButtonSize.cy == 0))  
{
UINT style = GetButtonStyle();
style &= ~BS_OWNERDRAW;
SetButtonStyle(style);  
}
CDC * mydc=CDC::FromHandle(lpDrawItemStruct->hDC);
CDC * MemDC = new CDC;
MemDC->CreateCompatibleDC(mydc);
CBitmap * p0ldBitmap = MemDC->SelectObject(&mybitmap);
if(m_bHover) //停留在按钮上
{
m_nalphaValue = 200;
TRACE("%d\n",m_nalphaValue); 
//mydc->BitBlt(0,00,m_ButtonSize.cx,m_ButtonSize.cy,MemDC,21,0,SRCCOPY);
DrawTransparentBitmap(mydc,0,0,m_ButtonSize.cx,m_ButtonSize.cy,MemDC,21,0,200);
}else
{
m_nalphaValue = 50;
TRACE("%d\n",m_nalphaValue);
mydc->BitBlt(0,00,m_ButtonSize.cx,m_ButtonSize.cy,MemDC,42,0,SRCCOPY);
//DrawTransparentBitmap(mydc,0,0,m_ButtonSize.cx,m_ButtonSize.cy,MemDC,42,0,200);
} MemDC->SelectObject(p0ldBitmap);delete MemDC;
/*delete MemDC;
mydc->DeleteDC();*/
}

解决方案 »

  1.   

    为什么要自定义,我响应MouseLeave消息了啊
      

  2.   

    MouseMove只能判断鼠标的移动,不能判断其方向,使用MouseOn,MouseLeave分别对应鼠标move到按钮上和leave开按钮动作
    自带没有leave消息,可自定义
      

  3.   

    //鼠标离开按钮
    LRESULT CHoverButtonEx::OnMouseLeave(WPARAM wparam, LPARAM lparam)
    {
    m_bTracking = FALSE;
    m_bHover=FALSE;
    Invalidate();
    return 0;
    }
      

  4.   

    OnMouseLeave函数执行了。 所以半透和不透明的重叠了
      

  5.   

    OnHover()
    {
       if(!m_bHover)
       {
           Invalidate();
           m_bHover = TRUE;
       }
    }OnLeave()
    {
       m_bHover = FALSE;
       Invalidate();
       
    }
      

  6.   

    有点小错 呵呵
    这个主要看自己对状态怎么处理了
    OnHover()
    {
      if(!m_bHover)
      {
        //先设置状态,然后再绘制,可以再绘制代码中判断状态     m_bHover = TRUE;
         Invalidate();

     
      }
    }
      

  7.   

    首次启动程序,按钮为半透明状态,触发hover消息后,按钮变为不透明,离开按钮后,按钮依然不透明,半透和不透重叠在了一起???