【wxWidgets实现透明wxPanel_核心实现_原创思想】

描述

wxWidgets 根本就没有实现过透明wxPanel容器,你设置wxTRANSPARENT_WINDOW,结果sorry 黑色,哈哈哈哈, 就是和你作对.想想当下那么漂亮的桌面, 背景, 透明, 特效.哎 悲哀啊,实现不了,就那死板的界面特性.
网上找了好久,也是乱七八糟,改底层代码还是算了吧,升级特要命.都是只言片语,断章取义的东西,摸鱼了好久好久,终于在官网找到个伯克利大学的一个项目实现了想要的效果,可是源码居然run不动,一堆乱七八糟的依赖,哎,真tmd操蛋啊,看看扔了好久,可那个效果真的能改善界面观赏度啊,真不错,心不甘情不愿的范代码,垃圾堆里面翻找,真要吐了,反反复复搞了好几次,理解,测试,干,心力疲惫的终于搞出来了.

如何实现

  • wxFrame 为项目启动的主界面,一般我们默认会设置颜色,或背景图片,那就来个图片背景吧,切记此图将会全局使用到.
  • 构建一个自定义wxPanel它将实行我们的核心处理操作
  • 构建的wxPanel必须获取到wxFrame设置的背景对象,裁切到wxPanel容器大小,并且修饰一下
  • wxFrame 对象重绘背景时更新wxPanel背景,不然穿帮了.下面看看核心实现吧.

代码[非全部]

 void BGPabel::draw(wxDC& dc) {
	if (bgimage.IsOk()) {
		wxRect rect = GetRect();

		wxImage	img = bgimage.GetSubImage(wxRect(this->GetPosition().x, this->GetPosition().y, rect.GetWidth(), rect.GetHeight()));
		//img=	ImagePaletteHandler(img);

		dc.SetPen(*wxBLACK_PEN);
		dc.SetBackgroundMode(wxSOLID);
		dc.SetBrush(*wxTRANSPARENT_BRUSH);

		int s = img.GetWidth() * img.GetHeight();

		// 创建透明层
		// Setup the alpha channel.
		unsigned char* alphaData = new unsigned char[s];
		memset(alphaData, wxIMAGE_ALPHA_TRANSPARENT, s);

		for (int y = 0; y < s; y++) {
			alphaData[y] += 50;
		}

		img.SetAlpha(alphaData);

		dc.DrawBitmap(wxBitmap(img), 0, 0, true);
		dc.DrawRectangle(0, 0, img.GetWidth(), img.GetHeight());
	}
}

不错核心代码就这几句, 裁切wxFrame背景图片为wxPanel背景并且设置透明度, 效果马上就是其他语言实现的界面,还带透明效果.哈哈哈哈.

效果展示[真实效果哦]

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值