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