이 문서의 목적은 다른 컨트롤이 포함된 Windows Form에 반투명 이미지를 오버레이하여 컨트롤이 표시되지만 액세스할 수 없도록 하는 솔루션을 제공하는 것입니다.
이 효과를 얻으려면 다른 양식을 사용하여 기존 양식 위에 배치합니다. 새 양식의 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 Form에 반투명 오버레이를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!