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日

相关文章

  • C#内置泛型委托之Action委托

    当我们在C#中需要定义一个不带参数且没有返回值的委托时,可以使用Action委托来实现。Action委托是一个内置的泛型委托,用于封装一个无参数且无返回值的方法。 Action委托的语法 下面是Action委托的语法: public delegate void Action(); public delegate void Action<in T>…

    C# 2023年6月1日
    00
  • C# SortedList排序列表的实现

    C#中的SortedList是一种排序列表,它关联了键和值,并按键的排序顺序存储键值对。在本文中,我们将详细讲解如何使用C# SortedList排序列表,包括创建、添加、删除和排序键值对。 创建SortedList 我们可以使用泛型和非泛型方法创建SortedList对象。下面是创建一个非泛型的SortedList的示例代码: SortedList myS…

    C# 2023年6月8日
    00
  • C# winfrom 模拟ftp文件管理实现代码

    为实现C# WinForm中FTP文件管理,需要通过FTP协议连接到FTP服务器,并进行文件的上传、下载、删除和重命名等操作。这里提供一份完整攻略,包括相关API的使用和示例代码的实现。 连接FTP服务器 C# WinForm最常使用的.NET类库是System.Net,其中有一个FtpWebRequest类可以用于创建FTP请求,实现对FTP服务器的连接。…

    C# 2023年6月1日
    00
  • C#异常处理的一些经验和技巧

    C#异常处理的一些经验和技巧 概述 在编写C#程序时,避免不了会出现各种错误,例如:空引用、下标越界、文件不存在等等。这些错误如果不进行正确的处理,程序可能会崩溃甚至可能会损失一些敏感信息。本文将会为你介绍一些常见的C#错误处理技巧,帮助你更好地控制程序的异常情况。 try-catch语句 try-catch语句是C#语言中处理异常情况的一种常用技巧。try…

    C# 2023年5月15日
    00
  • ASP.NET Core MVC 从入门到精通之初窥门径

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员,仅供学习分享使用。   什么是MVC?   MVC是一种架构模式,也是一种设…

    C# 2023年4月18日
    00
  • C# Split分隔字符串的应用(C#、split、分隔、字符串)

    C# Split分隔字符串的应用 在C#中,Split方法用于将一个字符串分隔成若干个子串,并将这些子串存放在一个字符串数组中。 以下我们将详细讲解Split方法的使用步骤及示例说明。 使用步骤 首先创建一个字符串对象,该对象表示待分隔的字符串。 string str = “C# Split 分隔字符串的应用”; 调用Split方法,设置分隔符,并将分隔后的…

    C# 2023年6月1日
    00
  • ASP.NET缓存方法分析和实践示例代码第2/2页

    下面我会详细讲解ASP.NET缓存方法分析和实践示例代码第2/2页的完整攻略。 1. 简介 缓存是提高应用程序性能的重要手段之一。ASP.NET框架提供了多种缓存方法,本文将讨论分析ASP.NET缓存方法并提供示例代码。 2. ASP.NET缓存方法分析 ASP.NET框架提供的缓存方法主要有以下几种: (1)HttpContext.Cache HttpCo…

    C# 2023年5月31日
    00
  • 使用ajax局部刷新gridview进行数据绑定示例

    下面是使用ajax局部刷新gridview进行数据绑定的完整攻略,包含两条示例说明。 什么是ajax局部刷新 ajax(Asynchronous JavaScript and XML)是一种无需重新加载整个页面而能够更新其中某个局部内容的Web开发技术。当数据发生变化时,ajax技术可以局部刷新响应部分,而不用重新加载整个页面,从而提高用户体验。 如何使用a…

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