本文旨在提供一個在包含其他控制項的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中文網其他相關文章!