Dibuja una imagen de superposición semi transparente en todo el formulario de Windows con algunos controles

Dibuje una imagen de superposición semi transparente en el formulario de Windows con algunos controles para que todos sus controles secundarios estén visibles pero no pueda hacer clic en ellos. Debería simplemente ver algunas cosas a través de un espejo negro semi transparente.

He intentado usar el control transparente. Eso es subclasificar el control del Panel y dibujar la imagen sobre ese control, sin embargo, todos los controles son completamente visibles.

Esto requerirá otra forma que muestre sobre la existente. Su propiedad Opacidad puede crear el efecto deseado. Agregue una nueva clase a su proyecto y pegue el código que se muestra a continuación. Llame al método Close () para eliminar el efecto nuevamente.

using System; using System.Drawing; using System.Windows.Forms; using System.Runtime.InteropServices; class Plexiglass : Form { public Plexiglass(Form tocover) { this.BackColor = Color.DarkGray; this.Opacity = 0.30; // Tweak as desired 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(); // Disable Aero transitions, the plexiglass gets too visible 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) { // Ensure the plexiglass follows the owner this.Location = this.Owner.PointToScreen(Point.Empty); } private void Cover_ClientSizeChanged(object sender, EventArgs e) { // Ensure the plexiglass keeps the owner covered this.ClientSize = this.Owner.ClientSize; } protected override void OnFormClosing(FormClosingEventArgs e) { // Restore owner 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); } protected override void OnActivated(EventArgs e) { // Always keep the owner activated instead this.BeginInvoke(new Action(() => this.Owner.Activate())); } private const int DWMWA_TRANSITIONS_FORCEDISABLED = 3; [DllImport("dwmapi.dll")] private static extern int DwmSetWindowAttribute(IntPtr hWnd, int attr, ref int value, int attrLen); } 

Cree una ventana en capas que se mantenga en la parte superior de su formulario principal y se sincronice con su ubicación. Puede alterar el alfa de la ventana en capas con una imagen RGBA de 32 bits para obtener el efecto deseado.

Hay un artículo decente del proyecto de código que le muestra cómo hacer esto aquí .

Creo que un enfoque más simple es poner un control de etiqueta transparente donde establezca su opacidad y también desactivar su función de tamaño automático y cambiar el tamaño de la etiqueta al tamaño de la superficie que desea cubrir.

Luego, cuando quiera superponer la etiqueta, la envía al frente (programáticamente) y la hace visible. Cuando desee desactivar la superposición, envíela a la parte posterior y hágala invisible.

He hecho esto con una etiqueta de texto que se superpone a toda mi forma. Creo que funcionaría igual si en lugar de establecer la propiedad Text del control Label, estableces una imagen semitransparente (PNG).