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 :

override onpaint ne se déclenche pas


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Points : 50
    Points
    50
    Par défaut override onpaint ne se déclenche pas
    Bonjour,

    Je cherche à créer un label multilignes, pour cela je souhaite traiter le text du label lors de l'affichage afin d'insérer des retours à la ligne.

    Pour cela, j'ai créé un contrôle héritant de label dans lequel je surcharge le onpaint afin de réaliser mon traitement sur la chaîne.

    voici mon code dans la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    m_labelHelpTheme1 = new MonLabel();
    m_labelHelpTheme1.Text = "aaaaaaaaaaaaaaaaa";
    m_labelHelpTheme1.TextAlign = ContentAlignment.TopLeft;
    m_labelHelpTheme1.Font = new Font("Tahoma", 9, FontStyle.Bold);
    m_labelHelpTheme1.ForeColor = Color.Black;
    m_labelHelpTheme1.Location = new Point(10, 50);
    m_labelHelpTheme1.Width = ClassParameters.RightValue(230);
    m_labelHelpTheme1.Height = ClassParameters.RightValue(50);
    m_labelHelpTheme1.Parent = this;
    m_labelHelpTheme1.Visible = true;
    this.Controls.Add(m_labelHelpTheme1);
    voici mon code du label
    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
     
    using System;
    using System.Linq;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
     
    namespace MonApplication
    {
        public partial class MonLabel : Label
        {
            public MonLabel()
            {
                InitializeComponent();
            }
     
            protected override void OnPaint(PaintEventArgs pe)
            {
                //Ici je veux faire le traitement sur ma chaîne
     
                // Calling the base class OnPaint
                base.OnPaint(pe);
            }
        }
    }
    Mais le Onpaint surchargé ne se déclenche jamais....... impossible d'entrer dedans

    Avez-vous une idée du pb ?

    Merci d'avance pour votre aide.
    @+
    spender

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le label est déjà multiligne
    que veux tu qu'il fasses que tu penses qu'il ne fait pas déjà (peut etre qu'il ne veut pas couper les mots en deux, j'ai jamais fait gaffe)


    pourquoi partial class ?
    pourquoi avoir une sub initializecomponent ? (si tu as fait un nouveau usercontrol, ce n'est pas le mieux, une classe avec héritage suffit et donc pas de initializecomponent)
    de plus il ne faut pas faire le mybase.onpaint, sinon tu vas te retrouver avec 2x le texte

    pour le traitement qui affiche sur plusieurs lignes, ne t'embetes pas à coder ca toi meme, il y a des fonctions qui doivent le faire (les formatflags sur le drawstring par exemple)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    Bonjour,

    Je suis sous .net Compact framework et le label n'affiche pas l'ensemble de mes caractères mais il met tout sur une seule et même ligne.
    La solution que je voulais mettre en place était de découper ma chaîne en sous chaines et mettre un saut de ligne sur chaune des sous chaine. Pour cela, j'ai besoin du OnPaint pour avoir la longueur d'une sous chaine par rapport à la largeur du label.

    J'ai effectivement fait un usercontrol puis indiquer comme héritant de label comme indiqué sur un article msdn.

    En effet, je ne souhaite pas m'embêter car ces aspects graphiques me prennent du temps......
    Un drawString, pour quoi faire ?
    si tu as une solution ? une alternative ? je suis preneur !
    @+
    spender

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je ne connais pas le compact framework, peut etre que ca fonctionne différement

    enfin quand on veut overrider le onpaint, c'est pour dessiner soit meme le rendu, donc pour du texte ca serait avec un drawstring
    vu ta question, on dirait que tu n'as pas encore réfléchit à cette partie là auquel cas je t'invite à le faire avant de coder une partie de ton label

    sinon il serait plus simple d'overrider la propriété Text (ou overloader, pas sur qu'elle soit overridable)
    dans le set, tu stockes dans une variable le texte, puis tu set mybase.text avec un découpage (genre "aaaaaaaa" => "aaaa" + aller à la ligne + "aaaa"
    dans le get, tu retournes la variable du texte d'origine
    comme ca, le rendu fonctionne normalement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    salam,

    je pense que tu dois entourer ton traitement par une suspension du Layout comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    protected override void OnPaint(PaintEventArgs pe)
            {
                this.SuspendLayout();
     
                //Ici je veux faire le traitement sur ma chaîne
     
                this.ResumeLayout();
     
     
                // Calling the base class OnPaint
                base.OnPaint(pe);
            }
    Bon courage

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ce n'est pas ca qui va faire que la sub va etre appelée !

    de plus suspendlayout sert à dire que les controles de ce controles ne doivent pas etre redéssinés (et à mon avis il n'a aucun controles dans son label)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut,
    Astuce : Utilise plutot un System.Windows.Forms.TextBox.
    Tu trouvera dessus des propriétés comme ReadOnly, BorderStyle et Multiline, toutes présentes dans le compact framework et qui te permettront d'obtenir exactement le même rendu visuel qu'un label. C'est pas parfait mais ca t'évite de t'ennuyer avec le dessin, la surcharge de OnPaint, ainsi que le découpage de la chaine.

    Au passage, selon moi, surcharger le .Text pour découper le texte dedans est une mauvaise idée. Si la taille du label change, rien ne te permettra de savoir qu'il faut re-calculer le découpage de la chaine. Tu serais obligé d'ajouter des handlers sur tous les évènements impliquant un possible changement de découpage.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    des handlers pas forcément, un overrides de onsizechanged seulement (et on a le texte d'origine dans une variable)

    m'enfin sur le compact framework (donc avec peu de pixels), je ne pense pas qu'on s'amuse à déplacer des labels
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    Merci pour vos réponses.
    Le contrôle TextBox m'intéresse vivement si je n'ai rien à coder
    Je vais voir si ça peut le faire !!!!
    Je vous redis ça asap
    @+
    spender

  10. #10
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    handler ou override, ca implique tout de même de gérer ces évènements.
    Et puis il ne faut surtout pas raisonner en "sur le framework, et donc sur petit écran, je doute qu'on s'amuse a redimensionner un label". Car on oublie forcément des cas.
    Aucun appareils équipé de windows mobile n'a le même écran déjà. Rien ne t'indique non plus la résolution, la taille réelle disponible a l'affichage. Rien ne t'indique que demain il n'existera pas des portables avec de grand écrans (genre les "feuille numériques", ou projecteur intégré).
    Ensuite, faire quelque chose qui fonctionne partout est beaucoup plus utile, aujourd'hui il va se servir de ce label dans ce cas précis, mais demain ? Coder un contrôle utilisateur n'a pas beaucoup d'intérêt s'il n'est pas réutilisable.
    Enfin, non, sizechanged ne suffit pas. Si tu change la police ca change pas la taille du controle mais ca changera l'emplacement du découpage. Et ce n'est qu'un exemple, il doit exister d'autre cas où le découpage change pour une raison x ou y (l'affichage ou non des bordures, les marges internes, l'apparition d'une scrollbar, ...). Se baser uniquement sur la taille est totalement insuffisant. Même si ca pourrait l'être dans son cas précis à lui derrière sa machine de développement avec ses réglages.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    En effet ctxnop, tu avais raison, ce contrôle TextBox réponds à mon besoin.
    Il gère même les césures tout seul !!!

    Pour info, si ça peut servir à d'autres :

    J'ai mis le focus sur ma forme pour éviter que le prompt ne clignote dans le textbox vu que je souhaite m'en servir que pour de l'affichage et non en saisie.

    J'ai affecté plus particulièrement les propriétés suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    m_textBox.Multiline = true;
    m_textBox.TabStop = false;
    m_textBox.BackColor = Color.White;
    m_textBox.BorderStyle = BorderStyle.None;
    Merci pour votre aide et plus particulièrement à ctxnop
    @+
    spender

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

Discussions similaires

  1. Evènement qui ne se déclenche pas
    Par max.lille dans le forum Langage
    Réponses: 8
    Dernier message: 09/05/2006, 15h46
  2. [VB.NET] La croix rouge de fermeture ne déclenche pas close
    Par LaChips dans le forum Windows Forms
    Réponses: 10
    Dernier message: 07/04/2006, 16h45
  3. onmouseover qui ne se déclenche pas sous IE...
    Par narnou dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/03/2006, 17h26
  4. Un JOB qui ne se déclenche pas
    Par blids dans le forum Oracle
    Réponses: 15
    Dernier message: 09/02/2005, 21h14
  5. [trigger] ... qui ne se déclenche pas
    Par bozo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/01/2004, 11h31

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