首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板