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++Builder Discussion :

OnAdvancedDrawItem sur les TMenuItems


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut OnAdvancedDrawItem sur les TMenuItems
    Bonsoir,
    Une petite question qui devrait sembler toute bête...
    J'ai 5 TMenuItems dans un TPopupMenu, avec la propriété OwnerDraw a true.
    Donc dans l'évènement OnAdvancedDrawItem, j'appelle une fonction commune a tous les items :
    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
     
    void __fastcall TfrmPrincipale::ComunMenuItemDraw(TObject *Sender, TCanvas *ACanvas, TRect &ARect, TOwnerDrawState State)
    {
    ACanvas->FillRect(ARect);
    if (State.Contains(odSelected))
    {
    ACanvas->Font->Color = clRed;
    ACanvas->Font->Style = TFontStyles()<< fsBold;
    }
    else
    {
    ACanvas->Font->Color = clNavy;
    ACanvas->Font->Style = TFontStyles();
    }
    ACanvas->TextRect(ARect, 2, 2, ((TMenuItem *)Sender)->Caption );
    }
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ComunMenuItemDraw(Sender, ACanvas, ARect, State);
    Problème : seul le premier élément est dessiné...
    Ca doit être idiot mais, je n'arrive pas a voir ce que je ne fais pas pour que cela fonctionne en totalité...

    Merci d'avance,

    @+

  2. #2
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,
    J'ai modifié un peu le bout de code, et j'obtiens un 'truc' amusant...Cette fois ci, le 'Caption' des TMenuItems apparait bien sur le popup - je le vois en survolant la place supposée des éléments de menus - mais tous au même endroit ! ( )
    Dois-je en déduire que le TCanvas (paramètre de la fonction OnAdvancedDrawItem) représente toute la surface du TPpopupMenu et non pas celle du TMenuItem en cours de dessin ?
    Merci...
    @ +

    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
     
    ACanvas->Brush->Color = clSilver;
    ACanvas->FillRect(ARect);
    if (State.Contains(odSelected))
    {
    ACanvas->Font->Color = clRed;
    ACanvas->Font->Style = TFontStyles()<< fsBold;
    ACanvas->Rectangle(ARect);
    }
    else
    {
    ACanvas->Font->Color = clNavy;
    ACanvas->Font->Style = TFontStyles();
    }
    tagRECT* pRect = new tagRECT();
    pRect->left = ACanvas->ClipRect.left;
    pRect->right = ACanvas->ClipRect.right;
    pRect->top = ACanvas->ClipRect.top;
    pRect->bottom = ACanvas->ClipRect.bottom;
    DrawText(ACanvas->Handle, ((TMenuItem*)Sender)->Caption.c_str(), ((TMenuItem*)Sender)->Caption.Length(), pRect, 2);

  3. #3
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut Cantrelle,
    Je ne sais pas si cela peut t'aider, mis j'ai trouvé ca dans l'aide de Builder:
    Description

    Write an OnAdvancedDrawItem event handler to render the image of a menu item in an owner-draw menu. The ACanvas parameter provides a drawing surface on which to draw the menu item. The ARect parameter indicates the boundaries (in pixels) of the menu item on that canvas. The State parameter is a set indicating various aspects of the menu items state such as whether it is selected, checked, grayed, and so on.
    A priorie, le Canvas serait celui complet du menu item. Ca rejoint ton idée.

  4. #4
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Salut,
    J'ai un peu bricolé, a default de trouver qqchose de très carré.
    J'ai changé le prototype de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void __fastcall ComunMenuItemDraw(TObject *Sender, TCanvas *ACanvas, TRect &ARect, TOwnerDrawState State, int Index);
    qui est appellée dans l'évènement OnAdvancedDrawItem ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ComunMenuItemDraw(Sender, ACanvas, ARect, State, ((TMenuItem*)Sender)->MenuIndex);
    Ce qui donne, après qq tests :
    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
     
    ACanvas->Brush->Color = clSilver;
    ACanvas->FillRect(ARect);
    if (State.Contains(odSelected))
    {
    ACanvas->Font->Color = clRed;
    ACanvas->Font->Style = TFontStyles()<< fsBold;
    ACanvas->Rectangle(ARect);
    }
    else
    {
    ACanvas->Font->Color = clNavy;
    ACanvas->Font->Style = TFontStyles();
    }
    tagRECT* pRect = new tagRECT();
    pRect->left = ACanvas->ClipRect.left;
    pRect->right = ACanvas->ClipRect.right;
    if (Index > 0)
    {
            pRect->top = 20 * Index;
    }
    else
    {
            pRect->top = ACanvas->ClipRect.top;
            pRect->bottom = ACanvas->ClipRect.bottom;
    }
    DrawText(ACanvas->Handle, ((TMenuItem*)Sender)->Caption.c_str(), ((TMenuItem*)Sender)->Caption.Length(), pRect, DT_CENTER);
    //...
    Voili...
    @ +

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

Discussions similaires

  1. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  2. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  3. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11
  4. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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