我想做个半透明的按钮可以调节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();*/
}
{
// 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();*/
}
自带没有leave消息,可自定义
LRESULT CHoverButtonEx::OnMouseLeave(WPARAM wparam, LPARAM lparam)
{
m_bTracking = FALSE;
m_bHover=FALSE;
Invalidate();
return 0;
}
{
if(!m_bHover)
{
Invalidate();
m_bHover = TRUE;
}
}OnLeave()
{
m_bHover = FALSE;
Invalidate();
}
这个主要看自己对状态怎么处理了
OnHover()
{
if(!m_bHover)
{
//先设置状态,然后再绘制,可以再绘制代码中判断状态 m_bHover = TRUE;
Invalidate();
}
}