ホームページ > バックエンド開発 > C++ > C# を使用して Windows フォーム上に半透明のオーバーレイを作成する方法

C# を使用して Windows フォーム上に半透明のオーバーレイを作成する方法

Susan Sarandon
リリース: 2025-01-09 20:36:43
オリジナル
899 人が閲覧しました

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート