解决SetWindowCompositionAttribute使控件文本透明的问题

news/2025/2/4 16:33:48 标签: c++, ui, windows

用以下参数调用该API,能实现类似Aero的模糊透明效果。

参数具体含义见

https://zhuanlan.zhihu.com/p/569258181

http://www.memotech.de/WindowComposition/Text.txt

http://www.memotech.de/WindowComposition/WindowComposition.zip

DWORD accent[4] = { 3,0,0,0 };
struct {
	DWORD attrib;
	PVOID pvData;
	UINT cbData;
} AttribData = {19,accent,sizeof(accent)};
SetWindowCompositionAttribute(m_hWnd, &AttribData);

但会有个烦人的副作用:对主窗口调用该API后,上面的控件文本也会变透明。据测试,是一切用GDI绘制的黑色像素都会变透明。要想解决这一问题,按如下步骤操作(以VS2022为例): 

  1.  项目文件夹中新建文件app.manifest,输入如下内容:
    <?xml version="1.0" encoding="utf-8"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
       <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
          <application>
             <!-- Windows 10 and Windows 11 -->
             <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
             <!-- Windows 8.1 -->
             <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
             <!-- Windows 8 -->
             <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
          </application>
       </compatibility>
    </assembly>

    只把Win8加入supportedOS应该也行,三个都写上也无妨。目的就是让系统知道,该程序支持Win8以上版本,以使SetLayeredWindowAttributes函数支持子窗口(见MSDN)。

  2. 打开项目属性,确保选了“所有配置”和“所有平台”,在左侧导航栏点清单工具—输入和输出,右侧点附加清单文件右边的向下箭头,再点编辑。

  3. 输入app.manifest并确定(如图),回到项目属性页面再点确定。
  4. 給控件加上WS_EX_LAYERED扩展样式(改CreateWindowEx参数或用SetWindowLongPtr等) ,再对其调用SetLayeredWindowAttributes,alpha通道值设为255:
    SetLayeredWindowAttributes(hControl, 0, 255, LWA_ALPHA);
    实际应用时,需要给每个控件都设置一遍,用EnumChildWindows即可,不再赘述。

此办法实际上是给特定子窗口关闭了透明模糊效果,原理不明,我实验了好久得出了此办法。此法也可用于嵌入父窗口的子对话框,对子对话框调用该函数后,无需EnumChildWindows,即可使该子对话框及其上所有控件都不再有透明效果,如图:


http://www.niftyadmin.cn/n/5841671.html

相关文章

【大模型理论篇】最近大火的DeepSeek-R1初探系列1

1. 背景介绍 这一整个春节&#xff0c;被DeepSeek-R1刷屏。各种铺天盖地的新闻以及老板发的相关信息&#xff0c;着实感受到DeepSeek-R1在国外出圈的震撼。 DeepSeek推出了新的推理模型&#xff1a;DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是一个在没有经过监督微调…

C语言:数组的介绍与使用

1. 数组的概念 数组是⼀组相同类型元素的集合&#xff1b;从这个概念中我们就可以发现2个有价值的信息&#xff1a; • 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。 • 数组中存放的多个数据&#xff0c;类型是相同的。 数组分为⼀维数组和多维…

Ubuntu修改配置文件--编辑操作

例如。 1.打开 /etc/samba/smb.conf 该配置文件&#xff1a; sudo vi /etc/samba/smb.conf 2.当你运行sudo vi /etc/samba/smb.conf命令后&#xff0c;你需要按i键进入插入模式&#xff08;Insert Mode&#xff09;。这时&#xff0c;在屏幕底部你应该能看到“-- INSERT --”…

少样本提示词模板

文章目录 少样本提示词模板 少样本提示词模板 少样本提示是一种基于机器学习的技术&#xff0c;利用少量的样本&#xff08;即提示词的示例部分&#xff09;来引导模型对特定任务进行学习和执行。这些示例能让模型理解开发者期望它完成的任务的类型和风格。在给定的任务中&…

全面剖析 XXE 漏洞:从原理到修复

目录 前言 XXE 漏洞概念 漏洞原理 XML 介绍 XML 结构语言以及语法 XML 结构 XML 语法规则 XML 实体引用 漏洞存在原因 产生条件 经典案例介绍分析 XXE 漏洞修复方案 结语 前言 网络安全领域暗藏危机&#xff0c;各类漏洞威胁着系统与数据安全。XXE 漏洞虽不常见&a…

FPGA|例化生成的PLL功能IP核

1、例化上一篇文章中调用的IP核&#xff0c;新建文件PLL_test.v 2、代码如图 timescale 1ns / 1ps module PLL_test(input clk,input rst_n,output clkout0,output clkout1,output clkout2,output clkout3,output clkout4);wire locked;PLL pll_inst(.inclk0(clk),.c0(clkout0)…

asp.netcore 有关jwt的依赖包介绍

1. Microsoft.AspNetCore.Authentication.JwtBearer (8.0.10) 这是 ASP.NET Core 官方提供的用于处理 JWT Bearer 认证的包。它的主要作用是将 JWT 认证集成到 ASP.NET Core 的认证系统中。 主要功能&#xff1a; JWT 认证中间件&#xff1a;提供了一个中间件&#xff0c;用于…

怀旧经典:1200+款红白机游戏合集,Windows版一键畅玩

​沉浸在怀旧的海洋中&#xff0c;体验经典红白机游戏的魅力&#xff01;我们为您精心准备了超过1200款经典游戏的合集&#xff0c;每一款都是时代的印记&#xff0c;每一场都是回忆的旅程。这个合集不仅包含了丰富的游戏资源&#xff0c;还内置了多个Windows版的NES模拟器&…