C# 透明窗体制作实现方法比较分析

C#中透明窗体的制作实现方法比较有不同的方式,本攻略将分别介绍三种用于制作透明窗体的方法,并分析比较它们的优缺点。

方式一:使用 Form 的 Opacity 属性

使用该方法,制作出的透明窗体是基于整个窗体的透明度来实现的,可使用 Form 的 Opacity 属性来设置窗体的透明程度,取值范围是0-1之间。

private void Form1_Load(object sender, EventArgs e)
{
    this.Opacity = 0.5;
}

优点:使用简单,不需要太多的代码即可实现透明窗体。

缺点:该方法只能实现整个窗体的透明度控制,不能控制窗体上单独控件的透明度,且不能设置透明窗体的层级关系。

方式二:使用窗体的双缓冲技术实现透明效果

使用该方法,可通过设置ExStyles属性以及DeviceContext属性实现窗体的透明效果。

public class TransparentForm : Form
{
    private const int WS_EX_TRANSPARENT = 0x00000020;
    private const int WS_EX_LAYERED = 0x00080000;
    private const int WS_EX_NOACTIVATE = 0x08000000;

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_NOACTIVATE;
            return createParams;
        }
    }

    public TransparentForm()
    {
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.DrawRectangle(Pens.Black, this.ClientRectangle);
    }
}

优点:可以实现窗体上单个控件和整个控件渐变的透明度控制,可以设置窗体的层级关系。

缺点:使用该方法需要编写较多的代码并且易产生闪烁的问题,需要在制作窗体时保证窗体的层级关系以及窗体每个控件的尺寸。

方式三:使用 Windows API 实现窗体透明

使用该方法,可以通过引用 Windows API 的特性,并且使用UpdateLayeredWindow函数来实现透明的窗体。

public class TransparentForm : Form
{
    [DllImport("user32.dll")]
    private static extern IntPtr GetDC(IntPtr handle);
    [DllImport("user32.dll")]
    private static extern int ReleaseDC(IntPtr handle, IntPtr hdc);
    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr handle, int nIndex, int dwNewLong);
    [DllImport("user32.dll")]
    private static extern int SetLayeredWindowAttributes(IntPtr handle, int crKey, int bAlpha, int dwFlags);

    private const int GWL_EXSTYLE = -20;
    private const int LWA_ALPHA = 0x00000002;

    public TransparentForm()
    {
        this.BackColor = Color.White;
        this.TransparencyKey = Color.White;
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= 0x00000020 | 0x00080000;
            return createParams;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.DrawRectangle(Pens.Black, new Rectangle(0, 0, Width - 1, Height - 1));
    }

    protected override void OnShown(EventArgs e)
    {
        base.OnShown(e);
        SetWindowLong(this.Handle, GWL_EXSTYLE, (int)GetWindowLong(this.Handle, GWL_EXSTYLE) | 0x80000 | 0x20);
        int argb = Color.White.ToArgb();
        SetLayeredWindowAttributes(this.Handle, argb, 100, LWA_ALPHA);
    }
}

优点:使用API调用可以精细地控制窗体的透明度,控制窗体每个控件的透明效果。

缺点:需要引用 API,写的代码比较多,容易出错,需要掌握一定的技术水平。

示例一:窗体背景透明

设置窗体背景图片透明,覆盖在其他窗体上方,添加显示内容。

 public Form1()
{
    InitializeComponent();
    this.BackColor = Color.Black;
    this.TransparencyKey = Color.Black;
}

private void Form1_Load(object sender, EventArgs e)
{
    this.TopMost = true;
    this.BackgroundImageLayout = ImageLayout.Zoom;
    this.BackgroundImage = Image.FromFile(@"E:\background.png");
    Label label = new Label
    {
        Text = "这是透明窗体内容",
        Font = new Font("Microsoft YaHei UI", 18F, FontStyle.Regular, GraphicsUnit.Point, 134),
        ForeColor = Color.White,
        AutoSize = true
    };
    this.Controls.Add(label);
    label.Location = new Point(this.Width / 2 - label.Width / 2, this.Height / 2 - label.Height / 2);
}

示例二:实现窗体的部分透明

使用示例一的代码,在 Form1 的构造函数中添加上 SetLayeredWindowAttributes 函数实现窗体的部分透明。

public Form1()
{
    InitializeComponent();
    this.BackColor = Color.Black;
    this.TransparencyKey = Color.Black;

    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    this.BackColor = Color.Transparent;

    SetLayeredWindowAttributes(this.Handle, 0, 128, 2);
}

以上就是制作 C# 透明窗体和实现方法比较的详细攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 透明窗体制作实现方法比较分析 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • Unity ScrollView实现无限循环效果

    下面是详细的“Unity ScrollView实现无限循环效果”的攻略: 1. 原理介绍 ScrollView是Unity中非常常用的滚动显示组件,但是如果要实现无限循环效果,需要对ScrollView进行改造。基本的思路是:在原有的ScrollView上拓展一个滑动方向的循环缓存列表,同时动态修改ScrollView的内容来保证显示的物品时刻与缓存列表中的…

    C# 2023年6月3日
    00
  • .NET Core分布式链路追踪框架的基本实现原理

    对于“.NET Core分布式链路追踪框架的基本实现原理”的详解,我将从以下四个方面进行阐述: 什么是分布式链路追踪框架? .NET Core分布式链路追踪框架的基本实现原理 分布式链路追踪框架的作用 分布式链路追踪框架的示例演示 1. 什么是分布式链路追踪框架? 分布式系统中,一个请求通常需要经过多个微服务协同处理才能完成,而在这么多的微服务中,如果出现了…

    C# 2023年6月3日
    00
  • abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之上(六十三)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)…

    C# 2023年5月4日
    00
  • c#数据绑定之删除datatable数据示例

    c#数据绑定之删除datatable数据示例 当我们使用c#编写程序时,有时需要对DataTable进行删除某些数据的操作,并且我们也需要确保在删除数据后页面及时刷新,使删除操作得到体现。下面,我们将详细讲解如何在c#中进行数据绑定和删除操作的完整攻略。 数据绑定操作 首先,在c#中进行数据绑定操作需要实现将数据源(如DataTable)绑定到控件,这样就可…

    C# 2023年6月1日
    00
  • .Net创建型设计模式之工厂方法模式(Factory Method)

    .Net创建型设计模式之工厂方法模式(Factory Method) 工厂方法模式是一种常用的创建型设计模式。该模式通过定义一个抽象工厂方法来把实例的创建延迟到其子类。工厂方法模式中,客户端调用创建对象时只需使用工厂方法,而无需关心具体的对象是如何创建的。这样就可以将客户端代码与具体对象的创建和组装过程解耦。 使用场景 工厂方法模式适用于需要大量创建对象的场…

    C# 2023年5月31日
    00
  • 如何使用C#程序给PDF文件添加编辑域

    下面是使用C#程序给PDF文件添加编辑域的完整攻略: 准备工作 在开始添加编辑域之前,我们需要准备一些工作。首先,我们需要下载和安装iTextSharp,这是一个开源的PDF编辑库。其次,我们需要安装Adobe Acrobat DC,这是一个非常流行的PDF编辑器,我们后续需要用它来验证PDF文件中添加的编辑域是否有效。 添加编辑域 一旦我们准备好了工作,我…

    C# 2023年6月1日
    00
  • C# javaScript函数的相互调用

    C#和JavaScript都是常用的编程语言,在Web开发中,经常需要对这两种语言进行交互。通过C#代码调用JavaScript函数可以为Web程序添加更多的交互性和动态性。同时,JavaScript函数也可以调用C#代码来实现更为复杂的功能,增强Web程序的性能和灵活性。 下面是“C#和JavaScript函数相互调用”的完整攻略: C#调用JavaScr…

    C# 2023年6月8日
    00
  • C# 限制输入为字母或数字以及长度

    日常开发过程中,验证字符的合法性一直是一个必不可少的步骤,以前都是在用户输入完再做判断,不仅麻烦在不符合标准的时候还要提示用户修改,体验很差,为什么不在输入的时候加以限制呢? 以 Winform的TextBox控件为例,这里提供两种方案: 通过字符匹配 正则表达式 在用户输入时限制,所以选用KeyPress事件。 字符匹配 private void txt_…

    C# 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部