如何让按钮背景透明?

inforF 2010-06-23 04:52:09
RT

我在对话框上面加载了背景,在OnPaint中的else中加入:
		//绘制背景
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC memoryDC;
if ( memoryDC.CreateCompatibleDC(&dc) )
{
BITMAP bm;
m_bmpBK.GetBitmap(&bm);
CBitmap* pOldBitmap = memoryDC.SelectObject(&m_bmpBK);
dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&memoryDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
memoryDC.SelectObject(pOldBitmap);
DeleteObject(memoryDC);
}


然后在按钮上加载了png图片(通过这个类:http://www.codeproject.com/KB/buttons/GdipButton.aspx)

但是当我的对话框的大小改变时,按钮的背景并没有跟着改变,而是原来的那个。

加载png图片的类里面提供了设置按钮背景的接口,可是我尝试后无效。(方式:使用CBitmap类导入bmp背景,然后直接在OnEraseBkgnd中返回TRUE,在绘制背景的OnPaint中的memoryDC.SelectObject(pOldBitmap);这句前面调用SetBkGnd,)

希望各位给点意见。或者使用其他办法加载png并让其随对话框背景的大小改变而自适应(也就是背景透明)

...全文
1891 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-07-03
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
inforF 2010-06-25
  • 打赏
  • 举报
回复
继续等待高手出现。。。
inforF 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 psbeond 的回复:]
闪烁不是由于楼上所说导致的,根本原因是同一个区域在比较快的时间内,不断绘制不同内容导致的。对于同一个窗口来说, 解决闪烁可以让所有内容在内容中画好,并且一次性绘制到窗口上来解决,也就是所谓的双缓冲,但只有这样, 也不能完全解决闪烁,因为往窗口上绘制,有好多消息, 比较绘制背景的erase back ground消息也可以绘制, paint消息也可以,如果这两个消息绘制的内容不同, 并且一前一后绘制……
[/Quote]

额。。。跟我的问题没有任何关系啊。

不过也学到东西了
inforF 2010-06-24
  • 打赏
  • 举报
回复


关键当背景更新时如何获得变化后的父窗口背景的CDC的对应区域了?
BloodFighter 2010-06-24
  • 打赏
  • 举报
回复
那就用我说的第一种方法,按钮在绘制之前,先调用父窗口来InvalideRect,然后再bltbit

这样子的好处就是有点“真实的透明了”,虽然还不真正的,但是有点那么个思想了

缺点也是很明显的,InvalideRect偶尔会导致父窗口全部界面刷新重绘,闪烁严重,要再处理闪烁

可以考虑吧InvalideRect与RedrawWindow配合使用,在需要完全刷新的时候,InvalideRect,如果背景不需要刷新,就别invalide这样效果能好一些



还有父窗口背景变化,你可以通知按钮更新背景图啊,一样的可以走第二种方法
inforF 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bloodfighter 的回复:]
MFC下,就没有真正的透明,所谓的透明,都是先让背景刷一遍,然后再把png透明贴上去
真正的透明还得DirectUI

MFC按钮的透明我觉得有2个方法:
1.通知父窗口InvalideRect,然后再绘制自己
2.把父窗口的CDC的对应区域,预存下来,每次绘制的时候,先刷背景,这种方法可以看CButtonST的实现
[/Quote]

是的,所谓的透明,都是先让背景刷一遍,然后再把png透明贴上去。
我也是这样做的。
也参考了CButtonST的实现,可是初始化的时候可以。

当背景改变时不行,不知道是不是在背景改变时候获取父窗口的CDC的对应区域的地方不对。

因为是使用StretchBlt让背景自适应窗口大小的。

如何获得变化后的父窗口的CDC的对应区域了?
BloodFighter 2010-06-24
  • 打赏
  • 举报
回复
MFC下,就没有真正的透明,所谓的透明,都是先让背景刷一遍,然后再把png透明贴上去
真正的透明还得DirectUI

MFC按钮的透明我觉得有2个方法:
1.通知父窗口InvalideRect,然后再绘制自己
2.把父窗口的CDC的对应区域,预存下来,每次绘制的时候,先刷背景,这种方法可以看CButtonST的实现
psbeond 2010-06-24
  • 打赏
  • 举报
回复
闪烁不是由于楼上所说导致的,根本原因是同一个区域在比较快的时间内,不断绘制不同内容导致的。对于同一个窗口来说, 解决闪烁可以让所有内容在内容中画好,并且一次性绘制到窗口上来解决,也就是所谓的双缓冲,但只有这样, 也不能完全解决闪烁,因为往窗口上绘制,有好多消息, 比较绘制背景的erase back ground消息也可以绘制, paint消息也可以,如果这两个消息绘制的内容不同, 并且一前一后绘制, 也会闪烁, 所以要统一在一个消息内,如paint消息中绘制, 然后erase消息中直接return true.

以上所说是解决一个窗口的闪烁, 如果是父子窗口, 解决的方法是为父窗口指定WS_CLIPCHILDREN风格,也就是父窗口刷新的时候忽略被子窗口盖住的部分,这样,子窗口的区域只有子窗口来绘制,来父窗口就不再绘制这一块区域了。
项目名称:高仿QQ2013通讯DEMO-10.30更新 版本号:10.30 最新版本 下载内容: (C#)CC2013局域网通讯源码一份, 可引用至工具箱最新版CSkin.dll-10.30版本界面库一份。 界面库更新说明: CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签中添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分中文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件中可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息卡和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。 4.双击窗体最大化,最大化后再双击恢复原大小,(win7)。 5.部分细节调优。 实现功能: 1.界面库中多达25个自定义换肤控件,让每个控件设设属性就能达到你想要的效果,支持图片换肤和色调绘制。 2.四边阴影,毛边效果,可以设置阴影宽度和阴影颜色,支持所有系统。 3.拥有密码键盘输入,防护更贴心。 4.8种圆角窗体模式供你选择,淋漓尽致,润滑如圆。 5.登录主界面后,有登陆提示窗,提示上次登录的城市和时间。 6.皮肤随心变:拖动任意一张图片至主界面,就可以改变皮肤。 7.皮肤色调获取:改变皮肤的同时,将计算图片色调,再将其运用到窗体背景色。 8.皮肤尾部渐变:上下左右方均可实现,渐变皮肤。 9.皮肤拖拉方向:可以选择皮肤在拉伸的时候,粘着哪一边拖拉。 10.GDI+界面重绘,处理消息机制,3种移动模式和拉伸是否启用只需要设置一个属性的事就可以解决。 11.界面渐变闪现和闪退:不再像平凡的突然出现,采用API渐变机制,渐渐出现和消失,win7系统下还有动态缩小至任务的效果。 12.完美好友列表,可添加上千好友,不卡不掉线,还可以拖动好友到其他分组。 13.好友悬浮至头像可以查看详细资料卡。 14.窗口可调渐变后透明度:让窗体看起来更像是Vista玻璃窗体风格。 15.聊天窗口可发送图片,大文件,表情,还有震动。 16.按钮控件背景色拥有继承窗体背景主色调的功能,让整体色调保持一致。 17.更是有和如出一辙的扣扣截图。仿真度也达到100%,完美修复所有已知BUG。 18.聊天窗口,可以调字体颜色和字体样式等多项功能。 20.SkinLabel与SkinButton控件字体与窗体标题可以根据背景色暗亮度自动调节字体为黑还是白。 21.MessageBox提示框的美化,并继承调用窗口的色调与背景,MessageBox可所谓已达到帅气的不能再帅气的境界了。 22.天气皮肤自动变,所有窗体根据当地天气自动决定皮肤背景,CC最帅气功能之一。 23.个人资料卡及聊天窗体拥有动态CC秀展示。 24.主界面拖动换肤的同时,所关联的子窗体皮肤也会跟着变。 25.多线程大文件传输功能,支持无上限大文件传输,有进度条显示进程度。 26.界面库已封装了大图取主色调,颜色判断暗亮等多项功能。 27.如果你觉得获取天气让你的登录太慢不想要的话,注释相关调用方法即可快速登录。 界面库交流群:306485590 本人QQ:345015918 注意: Demo版不包括更新,为方便用户查看和使用属性等方法,dll只轻微加密。想反编译的就不要尝试了,里面有上百个类,改错改到你哭。 介意购买正版,永久更新配源码。 看截图或者想购买商业版的用户请访问以下地址: http://www.51aspx.com/code/TotalLikeQQ2013 特权:购买商业版的用户,有权利享有最快的更新服务,第一时间将最新版本的dll源码送到你手上。 使本项目源码或本项目生成的DLL前请仔细阅读以下协议内容,如果你同意以下协议才能使用本项目所有的功能,否则如果你违反了以下协议,有可能陷入法律纠纷和赔偿,作者保留追究法律责任的权利。 1、你可以在开发的软件产品中使用和修改本项目的源码和DLL,但是请保留所有相关的版权信息。 2、不能将本项目源码与作者的其他项目整合作为一个单独的软件售卖给他人使用。 3、不能传播本项目的源码和DLL,包括上传到网上、拷贝给他人等方式。 4、以上协议暂时定制,由于还不完善,作者保留以后修改协议的权利。 时间:2013-7-5 作者: 乔克斯 请保留以上版权信息,否则作者将保留追究法律责任。

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧