2010-12-21 12 views
8

Dibuje una imagen de superposición semi transparente en todo 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.Dibuje una imagen de superposición semi transparente en todas las ventanas con algunos controles

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.

+1

wpf o winforms. – Will

Respuesta

3

Crea un layered window que se mantiene en la parte superior de tu formulario principal y se sincroniza 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 hacerlo here.

26

Esto va a requerir otro formulario que muestre encima del 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); 
} 
+0

funciona. Gracias Mohammed – MLS

+0

¿Cómo se llama exactamente esta clase? –

+1

Parece que es 'Utils.Plexiglass (esto);' ... ALT + F4 lo cerrará. Cualquier forma de obtener texto negro en la parte superior de esta ventana, p. "Por favor espera"? (Acabo de triplicar la opacidad y me ayudó con una etiqueta dinámica que agregué a esta superposición). – PeterX

0

Creo que un enfoque más simple es poner un control de etiqueta transparente donde se establece su opacidad y también desactivar su característica AutoSize y cambiar el tamaño de la etiqueta con el tamaño de la superficie que desea cubrir.

Luego, cuando desea 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 mi forma completa. Creo que funcionaría igual si en lugar de establecer la propiedad Text del control Label, estableces una imagen semitransparente (PNG).

Cuestiones relacionadas