IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Centrer la coche dans ma checkbox personnalisée


Sujet :

C#

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 752
    Points : 5 457
    Points
    5 457
    Par défaut Centrer la coche dans ma checkbox personnalisée
    Bonjour,

    Pour un projet Winform en 4.8, j'ai dérivé une case à cocher pour pouvoir agrandir la case en fonction de la taille de la fonte et également colorer la coche et le fond de la case dans des couleurs personnalisées.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    namespace Popo.Components
    {
        public class PopoCheckbox: CheckBox
        {
            public PopoCheckbox()
            {
                CheckMarkColor = Color.Black;
                CheckMarkBackColor = Color.White;
            }
     
            public Color CheckMarkColor { get; set; }
            public Color CheckMarkBackColor { get; set; }
     
            protected override void OnPaint(PaintEventArgs pevent)
            {
                // Taille de la case en fonction de la taille de la fonte
                Int32 side = Convert.ToInt32(Math.Floor(pevent.Graphics.MeasureString(Text, Font, Width).Height));
     
                pevent.Graphics.FillRectangle(new SolidBrush(BackColor), 0, 0, Width, Height);
     
                if (Checked)
                {
                    Int32 x = Convert.ToInt32(Font.Height / Font.Size); // Problème principal : ceci renvoie systématiquement 2  
                    Int32 y = x + 1;
     
                    pevent.Graphics.FillRectangle(new SolidBrush(CheckMarkBackColor), new Rectangle(0, 0, side, side));
                    pevent.Graphics.DrawString("ü", new Font("Wingdings", Font.Size, Font.Style), new SolidBrush(CheckMarkColor), x, y);
                }
                else
                {
                    pevent.Graphics.FillRectangle(new SolidBrush(BackColor), new Rectangle(0, 0, side, side));
                    pevent.Graphics.DrawRectangle(new Pen(ForeColor), new Rectangle(0, 0, side - 1, side - 1));
                }
     
                pevent.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), side, 0);
            }
        }
    }

    Le problème est que la coche est positionné en haut à gauche et que plus j'agrandis la taille de la fonte moins ma coche est centrée (elle reste en haut à gauche).
    J'aimerai que la coche s'affiche au centre de la case quelle que soit la taille de ma case (donc quelque soit la taille de ma fonte vu que proportionnelle).

    Une idée ?

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 752
    Points : 5 457
    Points
    5 457
    Par défaut
    J'aurai du y penser dès le départ, il faut simplement calculer le milieu comme on le ferait pour centrer une fenêtre.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    using (Font font = new Font("Wingdings", Font.Size, Font.Style))
    {
        SizeF size = pevent.Graphics.MeasureString("ü", font, side);
     
        Int32 x = Convert.ToInt32(Math.Ceiling((side - size.Width) / 2));
        Int32 y = x + 1 ;
     
        pevent.Graphics.FillRectangle(new SolidBrush(CheckMarkBackColor), new Rectangle(0, 0, side, side));
        pevent.Graphics.DrawString("ü", font, new SolidBrush(CheckMarkColor), x, y);
    }

    Il me reste encore un problème si AutoSize est à True.
    Il faut que je recalcule la hauteur et la largeur du composant complet.
    Je vais regarder comment fait Microsoft sur la case standard et adapter.

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 752
    Points : 5 457
    Points
    5 457
    Par défaut
    Bon, j'ai fouillé dans les sources de la CheckBox et de ces ancêtres mais plus j'explore et moins je comprends.
    Si quelqu'un a une solution pour que l'AutoSize à True ne tronque pas le texte, je suis preneur.

    Je marque tout de même le sujet comme résolu car mon problème initial était le positionnement de la coche.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 454
    Points : 998
    Points
    998
    Par défaut
    Ca va te faire une belle jambe mais je compatis ^^. J'ai lâché le winform après avoir passé un jour nue de mes applis sur la télé, j'avais calculé les marges, je faisais grossir un élément qui était cliqué sur des controls perso etc etc... Sur la télé tout était dégueulasse. Le simple fait d'avoir la police à 125% + une adaptation de windows à l'écran, des réglages qu'on trouve avec les nouvelles versions de windows... une catastrophe. Sur un 42" on ne voyait même plus le contenu de la liste . J'ai tout refait en wpf, pas plus mal au final. L'interface est plus jolie, j'ai pu rajouter pas mal de choses finalement. J'étais de l'école où je voulais faire du dynamique, tout contrôler etc, je craignais que wpf me bloque, au début ça n'a pas été évident, mais j'aurais du mal à repasser en arrière à présent.

    Courage !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher du/des noms coches dans des Checkboxs dynamique dans une textbox
    Par rampage92 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/12/2016, 11h13
  2. Checkbox pré-cochée dans un display-tag
    Par logan449 dans le forum Struts 1
    Réponses: 2
    Dernier message: 14/10/2008, 12h09
  3. Réponses: 4
    Dernier message: 20/08/2007, 01h16
  4. Comment savoir si dans Listview Checkbox est coché
    Par Ardely dans le forum Delphi
    Réponses: 8
    Dernier message: 16/01/2007, 10h51
  5. Liste des checkbox cochées dans un formulaire
    Par qwiskas dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/09/2006, 05h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo