C# 背景 透明 抗锯齿 (效果完美)

主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll,同时定义了一些结构体来配合这些 API 函数的使用,常用于处理图形绘制、窗口显示等操作。

运行查看效果

局部放大,抗锯齿效果很不错,尾巴毛毛清晰可见。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp7.Resources;
using static System.Net.Mime.MediaTypeNames;namespace WindowsFormsApp1
{public partial class Form1: Form{private const int WS_EX_LAYERED = 0x00080000;protected override CreateParams CreateParams{get{CreateParams cp = base.CreateParams;cp.ExStyle |= WS_EX_LAYERED;return cp;}}public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){InitializeComponent();var bitmap = Properties.Resources.index00;byte opacity = 255;//0-255 透明度调整double scalePercentage = 70; // 背景图片按70%缩放SetBitmap(bitmap, opacity, scalePercentage);CenterWindow(); //窗口 绝对 居中}public void SetBitmap(Bitmap bitmap, byte opacity, double scalePercentage){// 检查传入的位图的像素格式是否为 32 位包含 alpha 通道if (bitmap.PixelFormat != PixelFormat.Format32bppArgb)// 如果不是 32 位包含 alpha 通道的格式,抛出一个应用程序异常throw new ApplicationException("位图必须是 32 位包含 alpha 通道");// 计算缩放后的宽度和高度int newWidth = (int)(bitmap.Width * scalePercentage / 100);int newHeight = (int)(bitmap.Height * scalePercentage / 100);// 更新窗口的大小this.Size = new Size(newWidth, newHeight);// 缩放位图Bitmap resizedBitmap = new Bitmap(bitmap, newWidth, newHeight);// 获取屏幕设备上下文的句柄。设备上下文(DC)是一个包含图形对象及其属性、影响输出的图形模式的结构IntPtr screenDc = APIAliasing.GetDC(IntPtr.Zero);// 创建一个与指定设备上下文(这里是屏幕设备上下文)兼容的内存设备上下文IntPtr memDc = APIAliasing.CreateCompatibleDC(screenDc);// 初始化一个 IntPtr 类型的变量,用于存储位图的句柄,初始值为 IntPtr.Zero 表示空句柄IntPtr hBitmap = IntPtr.Zero;// 初始化一个 IntPtr 类型的变量,用于存储之前选入内存设备上下文的对象的句柄,初始值为 IntPtr.Zero 表示空句柄IntPtr oldBitmap = IntPtr.Zero;try{// 将 Bitmap 对象转换为 GDI 位图,并返回该位图的句柄。Color.FromArgb(0) 表示使用透明颜色hBitmap = resizedBitmap.GetHbitmap(Color.FromArgb(0));// 将指定的位图选入指定的设备上下文,并返回之前选入该设备上下文的对象的句柄oldBitmap = APIAliasing.SelectObject(memDc, hBitmap);// 创建一个 APIAliasing.Size 结构体的实例,用于表示位图的宽度和高度APIAliasing.Size size = new APIAliasing.Size(newWidth, newHeight);// 创建一个 APIAliasing.Point 结构体的实例,用于表示位图的源点(这里是左上角,坐标为 (0, 0))APIAliasing.Point pointSource = new APIAliasing.Point(0, 0);// 创建一个 APIAliasing.Point 结构体的实例,用于表示要绘制位图的目标位置,Left 和 Top 应该是类的属性,表示控件的左上角坐标APIAliasing.Point topPos = new APIAliasing.Point(Left, Top);// 创建一个 APIAliasing.BLENDFUNCTION 结构体的实例,用于指定混合操作的参数APIAliasing.BLENDFUNCTION blend = new APIAliasing.BLENDFUNCTION();// 设置混合操作的模式为 AC_SRC_OVER,表示源位图覆盖目标位图blend.BlendOp = APIAliasing.AC_SRC_OVER;// 混合标志,这里设置为 0 表示没有特殊的混合标志blend.BlendFlags = 0;// 设置源位图的常量 alpha 值,取值范围是 0 - 255,由传入的 opacity 参数决定blend.SourceConstantAlpha = opacity;// 设置 alpha 通道的格式为 AC_SRC_ALPHA,表示使用源位图的 alpha 通道blend.AlphaFormat = APIAliasing.AC_SRC_ALPHA;// 更新分层窗口的内容,将位图绘制到指定的窗口上。// Handle 是窗口的句柄,screenDc 是屏幕设备上下文,topPos 是目标位置,size 是位图大小,// memDc 是内存设备上下文,pointSource 是源点,0 是颜色键(这里不使用),blend 是混合参数,// APIAliasing.ULW_ALPHA 表示使用 alpha 混合模式APIAliasing.UpdateLayeredWindow(Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, APIAliasing.ULW_ALPHA);}finally{// 释放之前获取的屏幕设备上下文,将其返回给系统APIAliasing.ReleaseDC(IntPtr.Zero, screenDc);// 检查位图句柄是否不为空if (hBitmap != IntPtr.Zero){// 将之前选入内存设备上下文的对象重新选入,恢复设备上下文的状态APIAliasing.SelectObject(memDc, oldBitmap);// 删除之前创建的 GDI 位图对象,释放相关的系统资源APIAliasing.DeleteObject(hBitmap);}// 删除之前创建的内存设备上下文,释放相关的系统资源APIAliasing.DeleteDC(memDc);// 释放缩放后的位图资源resizedBitmap.Dispose();}}public void CenterWindow(){// 获取屏幕的工作区域(不包括任务栏)Rectangle screenBounds = Screen.PrimaryScreen.WorkingArea;// 计算窗口居中时的左上角坐标int left = (screenBounds.Width - Width) / 2 + screenBounds.Left;int top = (screenBounds.Height - Height) / 2 + screenBounds.Top;// 设置窗口的位置Location = new Point(left, top);}}
}

添加类 类名:APIAliasing

// 定义一个公共类 APIAliasing,用于封装一些 Windows API 相关的辅助功能
class APIAliasing
{// 使用 StructLayout 属性指定结构体在内存中的布局方式为顺序布局// 顺序布局意味着结构体的字段在内存中按照声明的顺序依次排列[StructLayout(LayoutKind.Sequential)]// 定义一个公共结构体 Size,用于表示二维平面上的大小,通常包含宽度和高度信息public struct Size{// 定义一个 32 位有符号整数类型的字段 cx,用于表示宽度public Int32 cx;// 定义一个 32 位有符号整数类型的字段 cy,用于表示高度public Int32 cy;// 定义结构体的构造函数,用于初始化结构体的字段// 参数 x 用于初始化 cx 字段,参数 y 用于初始化 cy 字段public Size(Int32 x, Int32 y){// 将参数 x 的值赋给字段 cxcx = x;// 将参数 y 的值赋给字段 cycy = y;}}// 使用 StructLayout 属性指定结构体在内存中的布局方式为顺序布局,并且设置字节对齐方式为 1 字节// 这样可以确保结构体的字段在内存中紧密排列,没有额外的填充字节[StructLayout(LayoutKind.Sequential, Pack = 1)]// 定义一个公共结构体 BLENDFUNCTION,用于表示混合操作的相关参数public struct BLENDFUNCTION{// 定义一个字节类型的字段 BlendOp,用于指定混合操作的类型public byte BlendOp;// 定义一个字节类型的字段 BlendFlags,用于指定混合操作的标志位public byte BlendFlags;// 定义一个字节类型的字段 SourceConstantAlpha,用于指定源图像的常量透明度值public byte SourceConstantAlpha;// 定义一个字节类型的字段 AlphaFormat,用于指定源图像的透明度格式public byte AlphaFormat;}// 使用 StructLayout 属性指定结构体在内存中的布局方式为顺序布局[StructLayout(LayoutKind.Sequential)]// 定义一个公共结构体 Point,用于表示二维平面上的一个点,通常包含 x 和 y 坐标信息public struct Point{// 定义一个 32 位有符号整数类型的字段 x,用于表示点的 x 坐标public Int32 x;// 定义一个 32 位有符号整数类型的字段 y,用于表示点的 y 坐标public Int32 y;// 定义结构体的构造函数,用于初始化结构体的字段// 参数 x 用于初始化字段 x,参数 y 用于初始化字段 ypublic Point(Int32 x, Int32 y){// 将参数 x 的值赋给字段 xthis.x = x;// 将参数 y 的值赋给字段 ythis.y = y;}}// 定义一个公共常量 AC_SRC_OVER,值为 0// 该常量通常用于指定混合操作的模式,表示源图像覆盖目标图像public const byte AC_SRC_OVER = 0;// 定义一个公共常量 ULW_ALPHA,值为 2// 该常量通常用于 UpdateLayeredWindow 函数,表示使用 alpha 混合public const Int32 ULW_ALPHA = 2;// 定义一个公共常量 AC_SRC_ALPHA,值为 1// 该常量通常用于指定源图像包含 alpha 通道信息public const byte AC_SRC_ALPHA = 1;// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 CreateCompatibleDC 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于创建一个与指定设备上下文兼容的内存设备上下文[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 CreateCompatibleDC,用于调用 Windows API 中的同名函数// 参数 hDC 表示要创建兼容设备上下文的源设备上下文句柄// 返回值为创建的兼容设备上下文的句柄public static extern IntPtr CreateCompatibleDC(IntPtr hDC);// 使用 DllImport 属性引入 user32.dll 动态链接库中的 GetDC 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于获取指定窗口的设备上下文句柄[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 GetDC,用于调用 Windows API 中的同名函数// 参数 hWnd 表示要获取设备上下文的窗口句柄// 返回值为获取的设备上下文的句柄public static extern IntPtr GetDC(IntPtr hWnd);// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 SelectObject 函数// ExactSpelling = true 表示使用精确的函数名进行查找// 该函数用于将指定的对象(如位图、画笔等)选入指定的设备上下文中[DllImport("gdi32.dll", ExactSpelling = true)]// 定义一个公共静态外部方法 SelectObject,用于调用 Windows API 中的同名函数// 参数 hDC 表示要选入对象的设备上下文句柄// 参数 hObj 表示要选入设备上下文的对象句柄// 返回值为之前选入该设备上下文的对象句柄public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObj);// 使用 DllImport 属性引入 user32.dll 动态链接库中的 ReleaseDC 函数// ExactSpelling = true 表示使用精确的函数名进行查找// 该函数用于释放之前通过 GetDC 函数获取的设备上下文[DllImport("user32.dll", ExactSpelling = true)]// 定义一个公共静态外部方法 ReleaseDC,用于调用 Windows API 中的同名函数// 参数 hWnd 表示之前获取设备上下文的窗口句柄// 参数 hDC 表示要释放的设备上下文句柄// 返回值为操作结果,非零表示成功,零表示失败public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 DeleteDC 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于删除指定的设备上下文[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 DeleteDC,用于调用 Windows API 中的同名函数// 参数 hDC 表示要删除的设备上下文句柄// 返回值为操作结果,非零表示成功,零表示失败public static extern int DeleteDC(IntPtr hDC);// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 DeleteObject 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于删除指定的图形对象(如位图、画笔等)[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 DeleteObject,用于调用 Windows API 中的同名函数// 参数 hObj 表示要删除的图形对象句柄// 返回值为操作结果,非零表示成功,零表示失败public static extern int DeleteObject(IntPtr hObj);// 使用 DllImport 属性引入 user32.dll 动态链接库中的 UpdateLayeredWindow 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于更新分层窗口的内容,支持 alpha 混合等效果[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 UpdateLayeredWindow,用于调用 Windows API 中的同名函数// 参数 hwnd 表示要更新的分层窗口句柄// 参数 hdcDst 表示目标设备上下文句柄// 参数 pptDst 表示目标窗口的左上角坐标,使用 Point 结构体// 参数 psize 表示要更新的区域大小,使用 Size 结构体// 参数 hdcSrc 表示源设备上下文句柄// 参数 pptSrc 表示源图像的左上角坐标,使用 Point 结构体// 参数 crKey 表示颜色键,用于指定透明颜色// 参数 pblend 表示混合操作的参数,使用 BLENDFUNCTION 结构体// 参数 dwFlags 表示更新操作的标志位// 返回值为操作结果,非零表示成功,零表示失败public static extern int UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pptSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 ExtCreateRegion 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于创建一个复杂的区域对象[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 ExtCreateRegion,用于调用 Windows API 中的同名函数// 参数 lpXform 表示可选的变换矩阵指针// 参数 nCount 表示区域数据的数量// 参数 rgnData 表示区域数据的指针// 返回值为创建的区域对象的句柄public static extern IntPtr ExtCreateRegion(IntPtr lpXform, uint nCount, IntPtr rgnData);
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端常见面试题-2025

vue4.0 Vue.js 4.0 是在 2021 年 9 月发布。Vue.js 4.0 是 Vue.js 的一个重要版本,引入了许多新特性和改进,旨在提升开发者的体验和性能。以下是一些关键的更新和新特性: Composition API 重构:Vue 3 引入了 Composition API 作为…

【工具插件类教学】实现运行时2D物体交互的利器Runtime2DTransformInteractor

目录 ​编辑 1. 插件核心功能 1.1 基础变换操作 1.2 高级特性 2. 安装与配置 2.1 导入插件 2.2 配置控制器参数 2.3 为物体添加交互功能 3. 使用示例 3.1 基础操作演示 3.2 多选与批量操作 3.3 自定义光标与外观 4. 高级配置技巧 4.1 动态调整包围框控件尺寸 4.…

alt+tab切换导致linux桌面卡死的急救方案

环境 debian12 gnome43.9 解决办法 观察状态栏,其实系统是没有完全死机的,而且gnome也可能没有完全死机。 1. alt f4 关闭桌面上的程序,因为这个方案是我刚刚看到的,所以不确定能不能用,比起重启系统,…

mac相关命令

显示和隐藏usr等隐藏文件文件 terminal输入: defaults write com.apple.Finder AppleShowAllFiles YESdefaults write com.apple.Finder AppleShowAllFiles NO让.bashrc每次启动shell自动生效 编辑vim ~/.bash_profile 文件, 加上 if [ -f ~/.bashrc ]; then. ~/.bashrc fi注…

Lineageos 22.1(Android 15)Launcer简单调整初始化配置

一、前言 Launcer的初始化配置主要在如下的xml文件夹下,默认读取的5x5 这里我们把device_profiles调整一下,然后新建一个default_workspace_my.xml作为我们自己的配置就行。 二、配置 注意Lineageos 的Launcer是在lineageos/packages/apps/Trebuchet…

排查JVM的一些命令

查看JVM相关信息的方法 环境&#xff1a; Win10, jdk17 查看端口的Pid netstat -ano | findstr <端口号>列出当前运行的JVM进程 ## 用于输出JVM中运行的进程状态信息。通过jps&#xff0c;可以快速获取Java进程的PID&#xff08;进程标识符&#xff09;&#xff0c; …

DeepSeek 助力 Vue 开发:打造丝滑的瀑布流布局(Masonry Layout)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

解决弹窗中form表单中按下tab键不切换的问题

开发过程中碰到el-dialog中使用的form组件&#xff0c;按下键盘tab键不会切换到下一个&#xff0c;普通页面就正常切换。 解决办法 <ElInputref"newPWDInput"v-model"newPWD":clearable"true":maxlength"16":tabindex"2&quo…

封装一个vue3控制并行任务数量的组合式函数

一. 使用场景 使用环境&#xff1a; vue3 当需要处理多个异步任务时&#xff0c;想要控制并行异步任务的数量&#xff0c;不想所有任务同时执行导致产生性能上的问题&#xff0c; 比如当需要同时发起多个网络请求&#xff0c;但又不想一次性发出过多请求导致服务器压力过大或…

最新华为 HCIP-Datacom(H12-821)2025.2.20

最新 HCIP-Datacom&#xff08;H12-821&#xff09;&#xff0c;完整题库请扫描上方二维码访问。 如图所示为某OSPF网络&#xff0c;已知R1和R2已,成功建立邻接关系&#xff0c;现一工程师在R2上配置了图中命令。那么在R2上查看LSDB时&#xff0c;可能存在以下哪些LSA? A&…

MongoDB between ... and ... 操作

个人博客地址&#xff1a;​​​​​​​MongoDB between ... and ... 操作 | 一张假钞的真实世界 MongoDB中类似SQL的between and操作可以采用如下语法&#xff1a; db.collection.find( { field: { $gt: value1, $lt: value2 } } );

vue2和vue3的按需引入的详细对比通俗易懂

以下是 Vue2 与 Vue3 按需引入的对比详解&#xff0c;用最简单的语言和场景说明差异&#xff1a; 一、按需引入的本质 目标&#xff1a;只打包项目中实际用到的代码&#xff08;组件、API&#xff09;&#xff0c;减少最终文件体积。类比&#xff1a;去餐厅点餐&#xff0c;只…

bash+crontab充当半个守护进程的歪招

两个cpolar下的不同程序&#xff0c;都需要定时监测&#xff0c;以免程序没有再运行。有点类似半个守护进程吧。但是守护进程不会写&#xff0c;咋搞&#xff1f;就用这个办法临时当下守门员。这里主要为了备忘xpgrep -各类参数的用法。 #!/bin/bashif pgrep -fl "check_…

Web自动化之Selenium 超详细教程(python)

Selenium是一个开源的基于WebDriver实现的自动化测试工具。WebDriver提供了一套完整的API来控制浏览器&#xff0c;模拟用户的各种操作&#xff0c;如点击、输入文本、获取页面元素等。通过Selenium&#xff0c;我们可以编写自动化脚本&#xff0c;实现网页的自动化测试、数据采…

如何调用 DeepSeek API:详细教程与示例

目录 一、准备工作 二、DeepSeek API 调用步骤 1. 选择 API 端点 2. 构建 API 请求 3. 发送请求并处理响应 三、Python 示例&#xff1a;调用 DeepSeek API 1. 安装依赖 2. 编写代码 3. 运行代码 四、常见问题及解决方法 1. API 调用返回 401 错误 2. API 调用返回…

基于flask+vue的租房信息可视化系统

✔️本项目利用 python 网络爬虫抓取某租房网站的租房信息&#xff0c;完成数据清洗和结构化&#xff0c;存储到数据库中&#xff0c;搭建web系统对各个市区的租金、房源信息进行展示&#xff0c;根据各种条件对租金进行预测。 1、数据概览 ​ 将爬取到的数据进行展示&#xff…

磐维数据库双中心容灾流复制集群搭建

1. 架构 磐维数据库PanWeiDB V2.0.0基于gs_sdr工具&#xff0c;在不借助额外存储介质的情况下实现跨Region的异地容灾。提供流式容灾搭建&#xff0c;容灾升主&#xff0c;计划内主备切换&#xff0c;容灾解除、容灾状态监控等功能。 2. 部署双中心磐维集群 2.1. 主集群 角色…

wordpress企业官网建站的常用功能

WordPress 是一个功能强大的内容管理系统(CMS)&#xff0c;广泛用于企业官网的建设。以下是企业官网建站中常用的 WordPress 功能&#xff1a; 1. 页面管理 自定义页面模板&#xff1a;企业官网通常需要多种页面布局&#xff0c;如首页、关于我们、产品展示、联系我们等。Wor…

Linux应用之构建命令行解释器(bash进程)

目录 1.分析 2.打印输入提示符 3.读取并且处理输入字符串 4.创建子进程并切换 5.bash内部指令 6.完整代码 1.分析 当我们登录服务器的时候&#xff0c;命令行解释器就会自动加载出来。接下来我们就。在命令行中输入指令来达到我们想要的目的。 我们在命令行上输入的…

ETL工具: Kettle入门(示例从oracle到oracle的数据导入)

kettle介绍 ETL工具,用于对数据的抽取&#xff08;Extract), 转换(Transform),加载 (Load&#xff09; Kettle 是一种ETL工具, 现称为 Pentaho Data Integration (PDI) 特点:纯JAVA语言编写 官方学习文档 网站: https://docs.hitachivantara.com/r/en-us/pentaho-data-int…