求助,不寻常的透明按钮,有难度!

laserman 2005-03-16 11:29:53
MFC自带的按钮是不能实现透明功能的,要实现透明,通常的解决方法是派生一个自绘按钮,在按钮中保存和背景一样的图片,按钮每次刷新的时候将图片作为背景,这样看上去的效果和透明是一样的,但这种方法只能实现静态背景图片,如果背景图片是gif之类的动态图片,显示上就会出问题。我的想法是做一个真正意义上的透明按钮,这样在后台背景变化的时候也不会有问题,请问如何实现?
...全文
1032 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2005-03-17
  • 打赏
  • 举报
回复
派生CButton,在OnEraseBkgnd()中return TRUE;在DrawItem()中绘图,确实是完全透明的,但是动态还不行。
laserman 2005-03-17
  • 打赏
  • 举报
回复
谢谢ipgk(loboho),
不过静态的可以,动态的还是不行,不知道还有什么方法没有。
难道只有设置按钮的区域吗?那可太麻烦了。
jerry 2005-03-17
  • 打赏
  • 举报
回复
设置按钮的区域. 让按钮只包含那些需显示的区域,
hushuangyan74 2005-03-17
  • 打赏
  • 举报
回复
大家讨论这么激烈,我就不说了。。。。
laserman 2005-03-16
  • 打赏
  • 举报
回复
这样不行.
其实我的意思就是做一个按钮,给按钮设定图标后,按钮的样子看上去就和图标一样,图标以外的范围显示的就是父窗口的背景,也不显示长方形的边框,但实际上还是能响应按钮消息.
效果就和将WEB页面设为桌面背景后,快捷方式"我的电脑"的效果差不多.
我想应该是按钮控件,不知道有没有什么别的方法.
老夏Max 2005-03-16
  • 打赏
  • 举报
回复
这个确实比较困难!动画的一直没有解决!当初有一个滚动字幕的透明和你这个问题一样,到现在还没有解决。关注!
ipgk 2005-03-16
  • 打赏
  • 举报
回复
你重载OnEraseBkgnd,直接return TURE。
不知你为什么要让按钮透明,这样不是很难看?你要透明还是半透明?
laserman 2005-03-16
  • 打赏
  • 举报
回复
请问如何实现?我派生的按钮默认都有小方框的,无法融入到背景中
ipgk 2005-03-16
  • 打赏
  • 举报
回复
你派生的按钮就可以实现透明,不用保存背景再画。
菜牛 2005-03-16
  • 打赏
  • 举报
回复
ipgk(loboho):
他这个按钮已经是继承类的了,就不需要SubclassWindow()了。
ipgk 2005-03-16
  • 打赏
  • 举报
回复
测试过,不一定要Create后再subclasswindow,只要Create时指定owndraw就可以,我说错了。不过透明是可以实现的。例子发了给你。
laserman 2005-03-16
  • 打赏
  • 举报
回复
楼上的,有例子吗?请发给我,laserman_x@yahoo.com.cn,谢谢。
ipgk 2005-03-16
  • 打赏
  • 举报
回复
凡是用这种方法创建的按钮都有背景
___________________
你这么肯定,我也没意见。反正动态创建的按钮我也是做过的,透明也是可以实现的,也许你的意思我真的不明白吧。不过我要说,只是m_testBtn.Create(。。是肯定不行的,一定要Create后再subclasswindow到m_testBtn。
laserman 2005-03-16
  • 打赏
  • 举报
回复
自定义一个按钮类,使用SetLayeredWindowAttributes会不会把在上面画的图案也变得透明?
我的想法是背景完全透明,按钮上的图标,文字完全不透明,这样行吗?
吹泡泡的小猫 2005-03-16
  • 打赏
  • 举报
回复
WS_EX_LAYERED

Windows 2000 or later: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.

按钮一般都是子窗口
I_Love_CPP 2005-03-16
  • 打赏
  • 举报
回复
这样的按钮就是真正意义上的透明按钮!
I_Love_CPP 2005-03-16
  • 打赏
  • 举报
回复
回复人: I_Love_CPP(我愛C++) ( ) 信誉:141 2005-03-16 13:52:00 得分: 0


既然透明/半透明的窗口都能实现,按钮当然也能实现透明/半透明。

自定义一个按钮类,使用
SetLayeredWindowAttributes


laserman 2005-03-16
  • 打赏
  • 举报
回复
执行上是没有问题的,可能我的表达不够清楚。
凡是用这种方法创建的按钮都有背景,通常将按钮的背景设成和按钮parent背景上同样位置的内容,这样看上去的效果就是一个透明按钮,这样的情况对于parent背景不变是没有问题的,但是如果parent背景是gif运动图片或者avi电影的运动画面,一眼就能看出毛病.
我就是想解决这个问题,达到真正意义上的透明按钮.
laserman 2005-03-16
  • 打赏
  • 举报
回复
// MyVCTestDlg.h : 头文件
//原有的东西忽略
// CMyVCTestDlg 对话框
class CMyVCTestDlg : public CDialog
{
//原有的东西忽略
public:
//CExplorer1为微软COM组件,名称为Microsoft Web浏览器,类是自动生成的
//界面上放了一个这样的控件
CExplorer1 m_IE;
//m_testBtn为自定义按钮,定义为变量
CMyTestButton m_testBtn;
}
// MyVCTestDlg.cpp : 实现文件
//原有东西忽略
void CMyVCTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//DDX控件绑定,m_IE在界面上放置了控件
DDX_Control(pDX, IDC_EXPLORER1, m_IE);
}
// CMyVCTestDlg 消息处理程序
//初始化对话框
BOOL CMyVCTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
//上边的东西都是自动生成的,下面的为添加的
//调用Create创建按钮并显示,
m_testBtn.Create("DDDD", WS_CHILD|WS_VISIBLE, CRect(0,0,100,100), &m_IE, 201);
//IE窗口转到csdn,作为背景
COleVariant mmm;
m_IE.Navigate("www.csdn.net", &mmm, &mmm, &mmm, &mmm);
//修改完毕
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
//这下应该不会引起歧义了
//为什么m_testBtn不用DDX_Control的原因是我不知道如何将m_testBtn的parent设为m_IE
//很长时间没用VC了,记忆难免有错,请各位多多指教,3ks
ipgk 2005-03-16
  • 打赏
  • 举报
回复
那就Create后再SubclassWindow,你在PreSubclassWindow下个断点,看有没执行到?
加载更多回复(8)

15,979

社区成员

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

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