(下载源码,见页面底部)
版本v1.1(2010年7月26日12:33:02)
优化了透明异形图的做法,增加实现了得到焦点状态,增加了增加了文字可以在
按钮外面的属性,增加了动态创建功能等
功能:
- 从资源或者外部导入图片,抠除mask色,实现按钮异形;
- 支持按钮3态、4态、5态,支持文字在按钮下方、右方,支持动态创建;
- 实现按钮的透明渐变效果;
- 3D按钮文字效果;
- 按钮Hover、点击声音效果;
- 设置按钮鼠标光标;
- 得到按钮左上角位置.
演示如下:
本次更新,技术难点就是透明异形图的绘制。上个版本用的是设置窗口区域的办法,不通用,而且那样换了其它情况,比如说就在对话框窗口上画时,就不行了。不过本次的方法,似乎效率要比设置窗口区域的办法低一些。感谢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) . 不足或者不清楚的地方,直接联系我!
————————–
附件下载
附件下载


dingding !
又从CSDN过来的么?感觉好久没去了……
对代码有疑问,或者有bug提建议的,直接留言
欢迎常来
运行不起来怎么回事呀??、error C2065: ‘IDC_HAND’ : undeclared identifier
希望瓜哥给个回复,好不好!我的QQ:287146519,我很急想要学习按钮的设计!
为了使用手形鼠标指针
VC++6.0下需要修改winuser.h源文件
#if(WINVER > = 0×0500)
#define IDC_HAND MAKEINTRESOURCE(32649)
#endif /* WINVER >= 0×0500 */
改为
#define IDC_HAND MAKEINTRESOURCE(32649)
这样就可以默认实现手形鼠标指针效果了!如果不会改,就把 ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_HAND));
return TRUE;
两行都注释掉!
你的word文档里说的有些我看不懂,有没有只做一个按钮的word文档,我需要了解一下操作过程,总耗时能有详细的过程说明,有视频就更好了!
加我QQ私聊。如果不在线离线留言
{smile:41}感觉很难
重庆江北的朋友你好啊!我是沙区的!
比较关心的是渐变效果的实现
用的是AlphaBlend API
非常好!!!