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

Windows Forms Discussion :

Tracer un trait sur un formulaire


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 943
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 943
    Par défaut Tracer un trait sur un formulaire
    Bonjour tout le monde,

    Microsoft ayant depuis longtemps abandonné le terrain pour ce qui est de proposer une case à cocher décente, j'essaie de m'y coller.

    Je vais donc avoir besoin d'une croix dans un carré, pour ça j'ai pensé à insérer un panel, puis tracer ses diagonales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //C#
            private void panel1_Paint(object sender, PaintEventArgs e)
            {
                Panel p = (Panel)sender;
                e.Graphics.DrawLine(Pens.Black, p.Left, p.Top, p.Right, p.Bottom);
            }
    Apparemment, j'ai chopé un bonnet d'âne au passage, peut-être allez-vous pouvoir m'aider à trouver où.

    Pour commencer, par rapport à quoi sont exprimées les coordonnées reçues ?

    J'ai fait comme si c'était des coordonnées absolues par rapport au coin supérieur gauche du contrôle que je suis en train de développer, mais dans la mesure où à l'exécution les deux carrés, Label et Panel, apparaissent vides, soit les coordonnées ne sont pas bonnes, soit j'ai un problème de surface opaque quelque part.

    Quelqu'un a-t-il des billes là-dessus ?

    C'est vrai qu'il y a la solution de facilité, qui consiste à tracer ça dans Paint (l'application), et insérer le résultat dans un contrôle image.

    Mais si il y a moyen de faire les choses proprement, autant essayer ...

    Nous avons affaire à un UserControl, dans un projet bibliothèque de contrôles Windows Forms .Net Framework.
    Si ça marche j'aimerais bien mettre mon contrôle dans la boîte à outils de Visual Studio 2022 Community.

    N.B. : J'ai le souvenir d'un contrôle Line, mais dans la mesure où je n'ai pas trouvé ça dans la boîte à outils, j'ai dû confondre avec la bureautique.

    Autre question : comment rédigez-vous la requête pour trouver l'aide du Panel, et celle de son événement Paint ?

    ***
    Histoire de ne pas rester en plan, j'ai mis un deuxième Label, sur le Panel. Puis, j'ai écrit un X dedans. Finalement, ça ne paraît pas absurde.

    Après ça, à l'exécution, j'ai été intrigué par une petite fioriture dans l'angle du Panel.
    Après avoir agrandi le Panel, il s'est avéré que c'était mon trait, dont l'angle supérieur gauche se trouvait juste là où je m'attendais à trouver son coin inférieur droit. Tiens, j'ai un doute au sujet de l'unité utilisée.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 001
    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 : 3 001
    Par défaut
    Pour gérer une case à cocher, tu dessines sur un panel !
    Forcément c'est plus compliqué car un panel ce n'est pas un case à cocher.

    Si tu veux redessiner la case à cocher, il faut partir d'une case à cocher.
    Ceci est loin d'être parfait mais c'est un début de piste :
    Code : 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
    public class DrawedColorCheckBox : CheckBox
        {
            public DrawedColorCheckBox()
            {
                CheckMarkColor = Color.Black;
                CheckMarkBackColor = Color.White;
            }
     
            public Color CheckMarkColor { get; set; }
            public Color CheckMarkBackColor { get; set; }
     
            protected override void OnPaint(PaintEventArgs pevent)
            {
                pevent.Graphics.FillRectangle(new SolidBrush(BackColor), 0, 0, Width, Height);
     
                Int32 y = Convert.ToInt32((Height - side) / 2M);
     
                if (Checked)
                {
                    pevent.Graphics.FillRectangle(new SolidBrush(CheckMarkBackColor), new Rectangle(0, y, side, side));
                    pevent.Graphics.DrawString("ü", new Font("Wingdings", 11, Font.Style), new SolidBrush(CheckMarkColor), 0, y + 2);
     
                }
                else
                {
                    pevent.Graphics.FillRectangle(new SolidBrush(BackColor), new Rectangle(0, y, side, side));
                    pevent.Graphics.DrawRectangle(new Pen(ForeColor), new Rectangle(0, y, side - 1, side - 1));
                }
     
     
                pevent.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), side, 0);
            }
     
            private const Int32 side = 16;
        }

  3. #3
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 943
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 943
    Par défaut
    Citation Envoyé par popo Voir le message
    Si tu veux redessiner la case à cocher, il faut partir d'une case à cocher.
    Oui, dans la pub on fait ça, aussi.
    "Pour faire un bon riz, il faut ... un bon riz."
    Pour que ça porte bien il faut des minettes qui font un sourire entendu.

    Ceci est loin d'être parfait mais c'est un début de piste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pevent.Graphics.FillRectangle(new SolidBrush(CheckMarkBackColor), new Rectangle(0, y, side, side));
    C'est vrai qu'après tout c'est plus simple de remplir le rectangle, plutôt que s'embêter à calibrer deux diagonales.
    Il y a quoi dans side ?
    Mais alors est-ce que ce n'est pas plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    label1.BackColor = Color.black;
    Autrement le coup du X, comme je disais, ça marche bien et c'est vite fait pour une taille fixe, là où ça se complique c'est pour rendre la taille réglable.

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 001
    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 : 3 001
    Par défaut
    Citation Envoyé par Gluups
    C'est vrai qu'après tout c'est plus simple de remplir le rectangle, plutôt que s'embêter à calibrer deux diagonales.
    A la différence que ce rectangle se concentre sur la zone limitée à la case de la case à cocher.

    Citation Envoyé par Gluups
    Il y a quoi dans side ?.
    Un entier, il correspond à la longueur du coté du carré correspondant à la case de la case à cocher.


    Citation Envoyé par Gluups
    Autrement le coup du X, comme je disais, ça marche bien et c'est vite fait pour une taille fixe, là où ça se complique c'est pour rendre la taille réglable
    Je ne l'ai pas caché, je l'ai dit ouvertement, c'est loin d'être parfait.
    Si la taille fixe t'embête, ce que je comprends car ça m'a embêté moi aussi, il faut gérer une corrélation avec la taille globale (en tenant compte également de la taille de la fonte).

    Moi j'ai procédé autrement en générant une image vectorielle en SVG à l'intérieur du composant.
    Malheureusement, mon contrat m'interdit d'en divulguer les sources.
    Mais le principe fonctionne à merveille et s'adapte automatiquement à la taille du composant.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 578
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 578
    Par défaut
    Comme p.Left et p.Top donne la position du panel par rapport à son parent et que p.Right et p.Bottom donne la distance entre les bords (gauche-droite et haut-bas) du controle; on voit que ce ne sont pas eux qu'il faut utiliser.
    Si tu veux la diagonale du panel, le plus logique est de partir de la coordonnée (0,0) du panel et que tu ailles à (p.Width, p.Height) , vu que e.Graphics fait référence à la zone graphique du contrôle concerné par l'événement.
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e.Graphics.DrawLine(Pens.Black, p.Left, p.Top, p.Right, p.Bottom)
    permet d'avoir une ligne sur la diagonale haut-gauche <=> bas-droit
    les 4 coordonnées des coins sont donc
    (0,0) -------------(0,Width)
    | |
    | |
    | |
    (Height,0)---------(Heigth,Width)
    L'alternative c'est d'utiliser e.ClipRectangle.Left, e.ClipRectangle.Top, e.ClipRectangle.Right et e.ClipRectangle.Bottom qui donnent la position des 4 points du rectangle https://learn.microsoft.com/fr-fr/do...tframework-4.8

  6. #6
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 943
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 943
    Par défaut
    Citation Envoyé par umfred Voir le message
    Comme p.Left et p.Top donne la position du panel par rapport à son parent et que p.Right et p.Bottom donne la distance entre les bords (gauche-droite et haut-bas) du controle; on voit que ce ne sont pas eux qu'il faut utiliser.
    Si tu veux la diagonale du panel, le plus logique est de partir de la coordonnée (0,0) du panel et que tu ailles à (p.Width, p.Height) , vu que e.Graphics fait référence à la zone graphique du contrôle concerné par l'événement.
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e.Graphics.DrawLine(Pens.Black, p.Left, p.Top, p.Right, p.Bottom)
    permet d'avoir une ligne sur la diagonale haut-gauche <=> bas-droit
    les 4 coordonnées des coins sont donc
    (0,0) -------------(0,Width)
    | |
    | |
    | |
    (Height,0)---------(Heigth,Width)
    L'alternative c'est d'utiliser e.ClipRectangle.Left, e.ClipRectangle.Top, e.ClipRectangle.Right et e.ClipRectangle.Bottom qui donnent la position des 4 points du rectangle https://learn.microsoft.com/fr-fr/do...tframework-4.8
    Bon, de mémoire, je dirais que c'est ce que j'ai fait, mais si tu dis que ça marche, c'est que je n'ai pas dû bien m'y prendre.
    Alors, il faudra y revenir.
    J'ai quelques trucs dans les tuyaux, mais peut-être bien que Dimanche ça peut cadrer.

  7. #7
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 943
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 943
    Par défaut
    Citation Envoyé par popo Voir le message
    Si la taille fixe t'embête, ce que je comprends car ça m'a embêté moi aussi, il faut gérer une corrélation avec la taille globale (en tenant compte également de la taille de la fonte).
    Bah, ce n'est pas tellement que ça m'embête, mais c'est que pour une taille fixe, en une heure j'ai créé deux Label, dont un avec un X dedans, et en fonction des clics je rends l'un visible ou l'autre.
    Si je dois rendre la taille variable je crée une énumération, pour proposer un certain nombre de tailles, et pour chacune j'évalue quelle taille de police il faut pour le X.

    Je trouve que tracer la diagonale du carré ça aurait plus de classe, et ça s'adapterait à la taille demandée avec une granularité plus fine.

    Moi j'ai procédé autrement en générant une image vectorielle en SVG à l'intérieur du composant.
    Malheureusement, mon contrat m'interdit d'en divulguer les sources.
    Mais le principe fonctionne à merveille et s'adapte automatiquement à la taille du composant.
    Oui, en gros, la réponse à la question posée au début, quoi ...

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 001
    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 : 3 001
    Par défaut
    Citation Envoyé par Gluups Voir le message
    Oui, en gros, la réponse à la question posée au début, quoi ...
    Absolument rien à voir.
    Je génère une image vectorielle.
    Toi tu veux juste tracer un trait en diagonale.
    Ce que tu peux faire avec un simple DrawLine comme l'a suggéré umfred.

Discussions similaires

  1. [WD17] Tracer un trait vertical sur un Graphe
    Par hunteshiva dans le forum WinDev
    Réponses: 6
    Dernier message: 17/07/2012, 16h22
  2. [PHP 5.2] Formulaire e-mail traité sur la même page
    Par oupsla dans le forum Langage
    Réponses: 3
    Dernier message: 06/04/2009, 13h31
  3. tracer un trait sur une image (avec ImageJ)
    Par Flouf dans le forum ImageJ
    Réponses: 1
    Dernier message: 05/04/2007, 16h45
  4. Réponses: 7
    Dernier message: 11/07/2006, 17h34
  5. pb avec des clés sur un formulaire
    Par marie253 dans le forum Bases de données
    Réponses: 7
    Dernier message: 17/06/2004, 13h53

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