(下载源码,见页面底部)

版本v1.1(2010年7月26日12:33:02)
优化了透明异形图的做法,增加实现了得到焦点状态,增加了增加了文字可以在
按钮外面的属性,增加了动态创建功能等

功能:

  1. 从资源或者外部导入图片,抠除mask色,实现按钮异形;
  2. 支持按钮3态、4态、5态,支持文字在按钮下方、右方,支持动态创建;
  3. 实现按钮的透明渐变效果;
  4. 3D按钮文字效果;
  5. 按钮Hover、点击声音效果;
  6. 设置按钮鼠标光标;
  7. 得到按钮左上角位置.

演示如下:

本次更新,技术难点就是透明异形图的绘制。上个版本用的是设置窗口区域的办法,不通用,而且那样换了其它情况,比如说就在对话框窗口上画时,就不行了。不过本次的方法,似乎效率要比设置窗口区域的办法低一些。感谢CSDN网友黄凯飞(ID: hkf314)提供思路!具体做法如下:

创建tmpDC,把相应透明度图像画进去,把图像区域以外的区域,填充mask色,然后用TransparentBlt,抠掉这颜色,然后把这个DC传给前台DC,画出来即可

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*这是我修改后的版本,nItem指定的是哪个状态的图像*/
void CAnimateButton::AlphaBitmap(int nItem)
{
	CDC* pDC = GetDC();
	CDC TmpDC;
	TmpDC.CreateCompatibleDC(pDC);
	//当然,TmpBmp用来记录画的内容
	CBitmap TmpBmp;
	TmpBmp.CreateCompatibleBitmap(pDC, m_nBtnWidth, m_nBtnHeight);
	TmpDC.SelectObject(&TmpBmp);
 
	//把按钮下的背景拷贝过来
	TmpDC.BitBlt(0, 0, m_nBtnWidth, m_nBtnHeight, pDC, 0, 0, SRCCOPY);
	//把内存DC中的图像透明地画出来
	AlphaBlend(TmpDC.m_hDC, 0, 0, m_nBtnWidth, m_nBtnHeight, m_pMemDC->m_hDC,
		 nItem * m_nBtnWidth, 0, m_nBtnWidth, m_nBtnHeight, m_bf);
 
	//填充异形图像以外的区域为mask色
	CRgn rgn;
	rgn.CreateRectRgn(0, 0, m_nBtnWidth, m_nBtnHeight);
	rgn.CombineRgn(&rgn, CRgn::FromHandle(m_arBmpRgn[nItem]), RGN_DIFF);
	CBrush maskBrh;
	maskBrh.CreateSolidBrush(m_clrTrans);
	TmpDC.FillRgn(&rgn, &maskBrh);
 
	//抠除mask色,直接画出来
 	::TransparentBlt(pDC->m_hDC, 0, 0, m_nBtnWidth, m_nBtnHeight, TmpDC.m_hDC,
 		 0, 0, m_nBtnWidth, m_nBtnHeight, m_clrTrans);
 
	ReleaseDC(pDC);
}

其它地方叙述起来,比较麻烦。大家先把代码下载下去看, 还可结合V1.0版教程看(见 http://www.cguage.com/2010/06/animate_button_1.html) . 不足或者不清楚的地方,直接联系我!
————————–

附件下载

CAnimateButton1.1.rar

附件下载