2 votes

Redessiner le graphique du bouton en cas de passage de la souris ou de clic.

J'ai créé un bouton personnalisé (un CloseButton) qui ressemble à ceci :

enter image description here

Lorsque je passe ma souris sur le bouton, la couleur devient rouge, comme ceci :

enter image description here

Je veux redessiner le "X" sur le bouton en blanc lorsque la souris est au-dessus du bouton, pour qu'il ressemble à quelque chose comme ceci (j'ai modifié l'image ci-dessus dans Paint pour montrer comment je veux que cela ressemble) :

enter image description here

Je ne sais pas comment m'y prendre.

Mon bouton personnalisé hérite essentiellement du contrôle Button ordinaire, avec quelques paramètres personnalisés. Le code est le suivant :

public class CloseButton : Button
{
    public CloseButton()
    {
        this.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
        this.FlatAppearance.BorderSize = 0;
        this.FlatAppearance.MouseDownBackColor = System.Drawing.Color.IndianRed;
        this.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DarkRed;
        this.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
        this.Size = new System.Drawing.Size(50, 30);
        this.UseVisualStyleBackColor = true;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        GraphicsPath gPath;
        Pen gPen;
        gPen = new Pen(System.Drawing.SystemColors.ControlText);
        gPath = new GraphicsPath();
        gPath.AddLine(20, 10, 30, 20);
        gPath.CloseFigure();
        gPath.AddLine(20, 20, 30, 10);
        gPath.CloseFigure();
        e.Graphics.DrawPath(gPen, gPath);
    }
}

J'ai essayé de modifier la méthode OnPaint() pour que la couleur du stylo soit déterminée par la couleur de fond du contrôle, comme suit :

if ((this.BackColor.Equals(System.Drawing.Color.DarkRed) || this.BackColor.Equals(System.Drawing.Color.IndianRed))
{
    gPen = new Pen(System.Drawing.SystemColors.ControlLightLight;
}
else
{
    gPen = new Pen(System.Drawing.SystemColors.ControlText;
}

Ensuite, dans mes gestionnaires MouseEnter et Click, j'invalide et rafraîchis le contrôle comme suit :

_BtnClose.Invalidate();
_BtnClose.Refresh();

Cela ne fait rien du tout. Comment puis-je réaliser ce que j'essaie de faire ? Si je suis coincé, je peux toujours créer un autre bouton personnalisé avec un X blanc dessiné dessus, et afficher/masquer ce bouton selon les besoins, mais j'aimerais éviter de le faire si possible.

2voto

Idle_Mind Points 8513

Je l'écrirais comme ça, alors :

public class CloseButton : Button
{

    GraphicsPath gPath;

    public CloseButton()
    {
        this.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
        this.FlatAppearance.BorderSize = 0;
        this.FlatAppearance.MouseDownBackColor = System.Drawing.Color.IndianRed;
        this.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DarkRed;
        this.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
        this.Size = new System.Drawing.Size(50, 30);
        this.UseVisualStyleBackColor = true;

        gPath = new GraphicsPath();
        gPath.AddLine(20, 10, 30, 20);
        gPath.CloseFigure();
        gPath.AddLine(20, 20, 30, 10);
        gPath.CloseFigure();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        bool cursorInControl = this.ClientRectangle.Contains(this.PointToClient(Cursor.Position));
        using (Pen gPen = new Pen(cursorInControl ? System.Drawing.SystemColors.ControlLightLight : System.Drawing.SystemColors.ControlText))
        {
            e.Graphics.DrawPath(gPen, gPath);
        }                
    }
}

Le GraphicsPath ne change jamais, il est donc déclaré au niveau du contrôle et conservé pour une utilisation future au lieu de le recréer à chaque fois. De même, chaque fois que vous créez un stylo, vous devez également vous en débarrasser, d'où l'utilisation de la fonction using bloc. Enfin, nous convertissons l'actuel Curseur.Position a coordonnées du client afin de pouvoir déterminer si elle se trouve dans la zone de contrôle. Ceci est utilisé pour changer les couleurs lorsque nous dessinons le GraphicsPath.

1voto

Reza Aghaei Points 4295

Une autre option facile pour dessiner la croix et changer la couleur de la croix :

  • Vous pouvez utiliser personnage pour le dessin de la croix. Vous pouvez facilement changer sa taille par la taille de la police.
  • Pour changer couleur, c'est suffisant pour gérer MouseEnter y MouseLeave et attribuer ForeColor . Cela redessinera le bouton.
  • Vous pouvez utiliser caractère pour Maximiser, pour la restauration et pour Minimiser :

enter image description here

using System;
using System.Drawing;
using System.Windows.Forms;
public class MyCloseButton : Button
{
    public MyCloseButton()
    {

        Anchor = AnchorStyles.Top | AnchorStyles.Right;
        FlatAppearance.BorderSize = 0;
        FlatAppearance.MouseDownBackColor = Color.IndianRed;
        FlatAppearance.MouseOverBackColor = Color.DarkRed;
        FlatStyle = FlatStyle.Flat;
        Font = new Font(Font.FontFamily, 13);
        Size = new Size(56, 36);
        UseVisualStyleBackColor = false;
        MouseLeave += (s, e) => ForeColor = Color.Black;
        MouseEnter += (s, e) => ForeColor = Color.White;
    }
    public override string Text { get => ""; set => base.Text = ""; }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        TextRenderer.DrawText(e.Graphics, "", Font, ClientRectangle, ForeColor);
    }
}

Vous pouvez rendre le bouton non sélectionnable pour éviter qu'il soit sélectionné par la souris ou le clavier en ajoutant la ligne suivante au constructeur :

SetStyle(ControlStyles.Selectable, false);

Vous pouvez ajouter le comportement de fermeture au bouton ForeColor en ajoutant le code suivant :

protected override void OnClick(EventArgs e)
{
    base.OnClick(e);
    FindForm()?.Close();
}

Si vous voulez un bouton plus grand avec une croix plus grande, modifiez la taille du bouton et sa taille de police :

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X