【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背景并且设置透明度, 效果马上就是其他语言实现的界面,还带透明效果.哈哈哈哈.

效果展示[真实效果哦]

【wxWidgets实现透明wxPanel_核心实现_原创思想】_第1张图片
【wxWidgets实现透明wxPanel_核心实现_原创思想】_第2张图片
【wxWidgets实现透明wxPanel_核心实现_原创思想】_第3张图片
【wxWidgets实现透明wxPanel_核心实现_原创思想】_第4张图片
【wxWidgets实现透明wxPanel_核心实现_原创思想】_第5张图片
【wxWidgets实现透明wxPanel_核心实现_原创思想】_第6张图片
【wxWidgets实现透明wxPanel_核心实现_原创思想】_第7张图片

你可能感兴趣的:(C/C++,精华版,wxWidgets实现,透明wxPanel,wxWidgets,透明容器,wxWidgets,原创分享,wxWidgets,透明面板)