- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MFC 动画按钮(异形透明渐变滑过声效等)的实现(一)- 切图透明渐变
源码下载: 页面底部
(麻烦大家在地址栏里面输一下,百度文档里面不准带文字链接的,所以只能运用图片了!)
C瓜哥终于实现CAnimateButton类了,写下来给大家分享下!
先看一下效果:
PostScript: 新浪的压缩率实在是太高了,把我1个多G的完全无压缩视频压缩成这样儿了!真是的!!大家凑合看一下~
(视频)
P.S.就是简单的图像按钮,从网上下来的代码,很多人都做得特别复杂。估计是用的方法是win95时代的方法,所以实现切图都似乎很麻烦(连透明画图的函数都得自己写,实现起来就麻烦了),所以这一次,能用API的地方尽量用API,就不自己写了,这样的话实现起来简单点!
做好图片
把按钮的几态都放在一张图片里面,觉得这样方便些。
按顺序做好图片: Normal、Hovered、Pressed、(Focused、disabled) 最后两个为可选
如图:
(设计缺口处,是为了观察异形切割按钮时的效果)
2)设置窗口样式
在PreSubclassWindow中实现:
void CAnimateButton::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CButton::PreSubclassWindow();
ModifyStyle(0, BS_OWNERDRAW);
//使图像不会被画到区域以外
/*1*/if (NULL != GetSafeHwnd())
{
if (!(GetButtonStyle() WS_CLIPSIBLINGS))
SetWindowLong(GetSafeHwnd(), GWL_STYLE, GetWindowLong(GetSafeHwnd(),
GWL_STYLE) | WS_CLIPSIBLINGS);
}
}
ModifyStyle(0, BS_OWNERDRAW) 增加所有者自绘的样式,这样就不必为应用到该类的按钮都指定了!
上面/*1*/处,使图像不会画到按钮区域以外(这样,只要实现按钮区域异形就成了。在按钮上面画图时,图就用不着抠了~)
但是你可能会说,那图上的mask色又用来干嘛?这个当然是用来取得按钮区域了!
注:关于WS_CLIPCHILDREN
(1)?WS_CLIPCHILDREN样式主要是用于父窗口,也就是说当在父窗口绘制的时候,父窗口上还有一个子窗口,那么设置了这个样 式的话,子窗口区域父窗口就不负责绘制。
(2)所有的overlapped和popup风格的窗口,都有WS_CLIPSIBLINGS?属性。也就是说这类风格的窗口,你是去不掉WS_CLIPSIBLINGS?属性的,不会在它重叠的兄弟窗口绘图;
(3)更进一步说明,WS_CLIPSIBLINGS只是用于子窗口(For use with the WS_CHILD style only.)
(4) WS_CLIPSIBLINGSz order)配合使用,才能看出明显的效果。
3)导入图像
准备好图像(文件或者图像资源),从
BOOL LoadBitmap(TCHAR* szFileName, COLORREF clrTans = RGB(255, 0, 255),
BOOL bHasFocusedState = TRUE, BOOL bHasDisabledState = TRUE);
BOOL LoadBitmap(UINT nIDBmp, COLORREF clrTans = RGB(255, 0, 255),
BOOL bHasFocusedState = TRUE, BOOL bHasDisabledState = TRUE);
导入,取得图像句柄,然后把剩余参数一齐传给PrepareBitmap函数处理
void CAnimateButton::PrepareBitmap(HBITMAP hBitmap, COLORREF clrTrans,
BOOL bHasFocusedState, BOOL bHasDisabledState)
{
m_bHasFocusedState = bHasFocusedState;
m_bHasDisabledState = bHasDisabledState;
//剪切透明区域
//--BitmapToRegion是一个SDK风格的全局函数,在主类中定义--
HRGN hRgn = BitmapToRegion(hBitmap, clrTrans, 4);
Set
文档评论(0)