• 【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());
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

    效果展示[真实效果哦]

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

  • 相关阅读:
    Coumarin 343 X azide/carboxylic acid/NHS ester,香豆素343 X 叠氮化物/羧基羧酸/琥珀酰亚胺活化酯
    代码随想录 Day27 贪心02中 LeetCode T55跳跃游戏
    Linux 常用命令
    2022-07-01 多线程互斥锁的一个案例
    如何在 Visual Studio Code 中使用 Prettier 格式化代码
    【随笔】致19期的小伙伴们
    Blazor前后端框架Known-V1.2.13
    深度解读 Linux 内核级通用内存池 —— kmalloc 体系
    嵌入式分享合集57
    【STM32】STM32F103C6T6标准外设库
  • 原文地址:https://blog.csdn.net/lch1985110/article/details/133987271