9
votes

Dessinez l'image de superposition semi transparente sur le formulaire Windows ayant des contrôles

Dessinez une image de superposition semi-transparente sur le formulaire Windows ayant des contrôles de manière à ce que tous ses contrôles pour enfants soient visibles, mais vous ne pouvez pas les cliquer. Il devrait juste aimer que nous voyons des choses à travers un miroir noir semi-transparent.

J'ai essayé d'utiliser un contrôle transparent. C'est la commande du panneau de sous-classement et la dessin de l'image sur ce contrôle, mais toutes les commandes sont entièrement visibles.


0 commentaires

3 Réponses :


3
votes

Créer un fenêtre superposée maintenue sur votre primaire former et synchronisé avec son emplacement. Vous pouvez modifier l'alpha de la fenêtre en couches à l'aide d'une image RGBA 32 bits afin d'obtenir l'effet souhaité.

Il y a un article décent de codeProject montrant comment faire ce ici . < / p>


0 commentaires

28
votes

Cela nécessitera une autre forme que vous affichez sur le dessus de l'existant. Sa propriété d'opacité peut créer l'effet prévu. Ajoutez une nouvelle classe à votre projet et collez le code ci-dessous. Appelez la méthode Fermer () pour supprimer l'effet.

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


5 commentaires

Comment cette classe est-elle appelée exactement?


On dirait que c'est utils.plexiglass (this); ... alt + f4 la fermera. Toute façon d'obtenir du texte noir sur cette fenêtre, par ex. "S'il vous plaît, attendez"? (Je viens de tripler l'opacité et cela a aidé avec une étiquette dynamique que j'ai ajoutée à cette superposition).


Hey Peterx, je me demandais simplement comment vous avez une étiquette à apparaître sur le plexiglass? Des pointeurs? :)


@Hanspassant, cette réponse est très utile mais il semble également faire des contrôles d'enfants (c.-à-d. Texte de label) semi-transparent. Existe-t-il un moyen de simplement avoir la forme semi-transparente alors que ses enfants sont entièrement opaques? Merci.


Bien sûr, c'est ce qu'est l'opacité. Cette classe n'est utile que pour couvrir une fenêtre existante », doit être visible, mais vous ne pouvez pas les cliquer» comme demandé par l'OP, il n'est pas utile d'afficher une interface utilisateur.



0
votes

Je pense qu'une approche plus simple consiste à mettre un contrôle transparent d'étiquettes dans lequel vous définissez son opacité et désactivez également sa fonctionnalité d'autosse et redimensionner l'étiquette à la taille de la surface que vous souhaitez couvrir.

Ensuite, lorsque vous souhaitez superposer l'étiquette, vous l'envoyez à l'avant (par programmation) et rendez-la visible. Lorsque vous souhaitez désactiver la superposition, envoyez-la à l'arrière et faites-la invisible.

Je l'ai fait avec une étiquette de texte qui superpose tout mon formulaire. Je pense que cela fonctionnerait simplement la même chose si au lieu de définir la propriété de texte du contrôle de l'étiquette, vous définissez une image semi-transparente (PNG).


0 commentaires