首页 > 后端开发 > C++ > 如何使用 C# 在 Windows 窗体上创建半透明覆盖层?

如何使用 C# 在 Windows 窗体上创建半透明覆盖层?

Susan Sarandon
发布: 2025-01-09 20:36:43
原创
903 人浏览过

How to Create a Semi-Transparent Overlay on a Windows Form Using C#?

在Windows窗体上叠加半透明图像

本文旨在提供一种在包含其他控件的Windows窗体上叠加半透明图像的解决方案,确保控件仍然可见但不可访问。

为了实现此效果,我们将使用另一个窗体并将其放置在现有窗体的顶部。新窗体的Opacity属性控制透明度级别。以下是一个可以添加到项目的自定义类:

<code class="language-csharp">using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class Plexiglass : Form
{
    public Plexiglass(Form tocover)
    {
        // 自定义叠加窗体的外观和行为
        this.BackColor = Color.DarkGray;
        this.Opacity = 0.30;
        this.FormBorderStyle = FormBorderStyle.None;
        this.ControlBox = false;
        this.ShowInTaskbar = false;
        this.StartPosition = FormStartPosition.Manual;
        this.AutoScaleMode = AutoScaleMode.None;
        this.Location = tocover.PointToScreen(Point.Empty);
        this.ClientSize = tocover.ClientSize;

        // 将叠加层与目标窗体关联,以跟踪其移动和大小调整事件
        tocover.LocationChanged += Cover_LocationChanged;
        tocover.ClientSizeChanged += Cover_ClientSizeChanged;
        this.Show(tocover);
        tocover.Focus();

        // 禁用Aero过渡效果,以获得更流畅的效果
        if (Environment.OSVersion.Version.Major >= 6)
        {
            int value = 1;
            DwmSetWindowAttribute(tocover.Handle, DWMWA_TRANSITIONS_FORCEDISABLED, ref value, 4);
        }
    }

    // 事件处理程序,用于更新叠加层的位置和大小
    private void Cover_LocationChanged(object sender, EventArgs e)
    {
        this.Location = this.Owner.PointToScreen(Point.Empty);
    }
    private void Cover_ClientSizeChanged(object sender, EventArgs e)
    {
        this.ClientSize = this.Owner.ClientSize;
    }

    // 调整窗体行为,以确保目标窗体保持焦点
    protected override void OnActivated(EventArgs e)
    {
        this.BeginInvoke(new Action(() => this.Owner.Activate()));
    }
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        this.Owner.LocationChanged -= Cover_LocationChanged;
        this.Owner.ClientSizeChanged -= Cover_ClientSizeChanged;
        if (!this.Owner.IsDisposed && Environment.OSVersion.Version.Major >= 6)
        {
            int value = 1;
            DwmSetWindowAttribute(this.Owner.Handle, DWMWA_TRANSITIONS_FORCEDISABLED, ref value, 4);
        }
        base.OnFormClosing(e);
    }

    // DWM API调用的常量
    private const int DWMWA_TRANSITIONS_FORCEDISABLED = 3;
    [DllImport("dwmapi.dll")]
    private static extern int DwmSetWindowAttribute(IntPtr hWnd, int attr, ref int value, int attrLen);
}</code>
登录后复制

要叠加图像,请在显示窗体时创建Plexiglass类的实例并将目标窗体作为参数传递。这将创建一个覆盖整个目标窗体的半透明叠加层,允许您看到现有控件,但阻止与它们的交互。

要移除叠加层,只需调用Plexiglass窗体实例的Close()方法。

以上是如何使用 C# 在 Windows 窗体上创建半透明覆盖层?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板