Disegna l’immagine sovrapposta semitrasparente su tutta la finestra con alcuni controlli

Disegna l’immagine sovrapposta semitrasparente su tutto il modulo di Windows con alcuni controlli tali che tutti i relativi controlli figlio dovrebbero essere visibili ma non puoi fare clic su di essi. Dovrebbe proprio come vediamo alcune cose attraverso uno specchio nero semi trasparente.

Ho provato a usare il controllo trasparente. Questo è sotto-classificare il pannello di controllo e disegnare l’immagine su quel controllo, tuttavia tutti i controlli sono completamente visibili.

    Questo richiederà un altro modulo che visualizzi sopra quello esistente. La sua proprietà Opacity può creare l’effetto desiderato. Aggiungi una nuova class al tuo progetto e incolla il codice mostrato di seguito. Chiama il metodo Close () per rimuovere di nuovo l’effetto.

    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); } 

    Crea una finestra a strati che viene tenuta in cima al tuo modulo principale e sincronizzata con la sua posizione. È ansible modificare l’alfa della finestra a livelli utilizzando un’immagine RGBA a 32 bit per ottenere l’effetto desiderato.

    C’è un articolo codeproject decente che ti mostra come farlo qui .

    Credo che un approccio più semplice sia quello di mettere un controllo Label trasparente dove si imposta la sua opacità e anche disabilitare la sua funzione AutoSize e ridimensionare l’etichetta alla dimensione della superficie che si vuole coprire.

    Quindi, quando si desidera sovrapporre l’etichetta, è necessario inviarla in primo piano (programmaticamente) e renderla visibile. Quando si desidera distriggersre l’overlay, inviarlo alla parte posteriore e renderlo invisibile.

    L’ho fatto con un’etichetta di testo che si sovrappone all’intero modulo. Penso che funzionerebbe allo stesso modo se invece di impostare la proprietà Text del controllo Label, si imposta un’immagine semi-trasparente (PNG).