この記事は、他のコントロールを含む 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 サイトの他の関連記事を参照してください。