Heim >Backend-Entwicklung >C++ >Wie erstelle ich mit C# ein halbtransparentes Overlay auf einem Windows Form?

Wie erstelle ich mit C# ein halbtransparentes Overlay auf einem Windows Form?

Susan Sarandon
Susan SarandonOriginal
2025-01-09 20:36:43952Durchsuche

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

Halbtransparente Bilder auf Windows Forms überlagern

Ziel dieses Artikels ist es, eine Lösung für die Überlagerung eines halbtransparenten Bildes auf einem Windows Form bereitzustellen, das andere Steuerelemente enthält, um sicherzustellen, dass die Steuerelemente sichtbar, aber nicht zugänglich bleiben.

Um diesen Effekt zu erzielen, verwenden wir ein anderes Formular und platzieren es über dem vorhandenen Formular. Die Opacity-Eigenschaft des neuen Formulars steuert den Transparenzgrad. Hier ist eine benutzerdefinierte Klasse, die Ihrem Projekt hinzugefügt werden kann:

<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>

Um ein Bild zu überlagern, erstellen Sie eine Instanz der Plexiglass-Klasse und übergeben Sie das Zielformular als Parameter, wenn das Formular angezeigt wird. Dadurch wird eine halbtransparente Überlagerung erstellt, die das gesamte Zielformular abdeckt und es Ihnen ermöglicht, vorhandene Steuerelemente zu sehen, aber eine Interaktion mit ihnen verhindert.

Um die Überlagerung zu entfernen, rufen Sie einfach die Methode Plexiglass der Formularinstanz auf. Close()

Das obige ist der detaillierte Inhalt vonWie erstelle ich mit C# ein halbtransparentes Overlay auf einem Windows Form?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn