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

Composants VCL Delphi Discussion :

[Menus] Comment changer la couleur de la flèche de sous-menu ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut [Menus] Comment changer la couleur de la flèche de sous-menu ?
    Je dessine moi-même mon menu en utilisant l'événement ondrawitem et j'aimerais également changer l'apparence de la flèche indiquant qu'il y a un sous-menu.

    Celle-ci est toujours noire et est ainsi difficile à voir si on a un menu de couleur foncée. J'aimerais la changer de couleur ou carrément utiliser un glyph personnel.

    Je sais que c'est possible puisque le composant shareware de TMS software le permet.

    Merci

  2. #2
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 773
    Points : 500
    Points
    500
    Par défaut
    salut regarde dans l'aide delphi..

    Cursors,propriété(TScreen)

    tu peux redefinir le curseur et meme les personnaliser , peut etre qu'ensuite si tu detecte le passage sur ton menu , tu peux charger un curseur adequat.

    bye.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Merci mais il y a une petite confusion ici

    Je ne cherche pas à changer le curseur mais la petite flèche qui est dessinée sur le menu lorsque celui-ci a un sous-menu.

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 773
    Points : 500
    Points
    500
    Par défaut
    Oki j'avais pas compris !!

    si tu as plus les couleurs windows par defaut c'est que tu redessines ton menu via les OndrawItems.., donc tu devrai aussi pouvoir redessiner cette fleche.

    Je crois que AdvancedDrawItem(...State: TOwnerDrawState) contrairement DrawItem(...) te renvoie les etat de ton items donc surement de la presence de la fleche ou pas .

  5. #5
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 773
    Points : 500
    Points
    500
    Par défaut
    oups !!
    Ce que je t'ai dit ne marche pas , la fleche semble etre dessiné la derniere et recouvre meme le texte que tu ecrit sur le canvas !!

    bye et bon courage!!

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    ouais c'est vraiment un petit problème énervant

    J'ai essayé de dessiner un graphique à droite du texte mais la flèche se dessine par dessus.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Je suis sur une piste
    Code du ondrawitem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      var
    dc:hdc;
    begin
    acanvas.Brush.Color:=clnavy;
    acanvas.FillRect(arect);
    acanvas.Font.Color:=clwhite;
    acanvas.Textout(1,arect.top,tmenuitem(sender).caption);
    dc:=acanvas.Handle;
    ExcludeClipRect(dc,arect.Left,arect.Top,arect.Right,arect.Bottom);
    ReleaseDc(0, dc);
    end;
    La flèche disparaît.
    Le problème est que le premier item du menu est visible mais que pour les suivants le soient il faut que je passe la souris au dessus au moins une fois.

    Une idée?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Je crois que je vais abandonner l'idée pour le moment.
    J'ai vraiment tout essayé.
    J'ai cherché, cherché et cherché encore. Aucune solution trouvée sur le net.

    Je devrai me contenter de la flèche de sous-menu standard.
    C'est pas que c'était très important mais c'est tout de même rageant.

  9. #9
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 112
    Points
    7 112
    Par défaut
    Si jamais tu trouve une solution, postes-là ici.
    Ca m'intéresse aussi.


  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Bien sûr.

    Peut-être que quelqu'un possédant le code source du menu de Tmssoftware pourrait y jeter un oeil et nous donner un indice ?

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Voilà la seule référence sur le sujet que j'avais trouvé sur le net (pas en delphi mais c'est facile à convertir). C'est d'où vient mon code delphi précédemment mentionné. Ça ne marche cependant pas totalement, la flèche disparaît mais comme je l'ai dit, seul le premier item est dessiné automatiquement.

    Doing this is really easy, but when you add a submenu, you can see that the submenu arrow appears automatically. You could think 'cool, less work for me !'. But windows draws the arrow in white when selected. And that is not what we want !!

    And now, how do we tell to windows not to draw that submenu arrow ? I've gone through all the MSDN and no one say anything about it. My first try was to add a clip region to my Graphics object, I thought it would prevent windows from drawing it, but it had no effect.

    But this way I discovered something interesting : Gdi+ clipping and Gdi clipping are totally independent. If you define a clipping region with Gdi+, you can still draw in that region using Gdi, and the reverse thing is also true. To prevent windows from drawing the submenu arrow, you must clip the region using the Gdi API.
    Once you known it, the answer is really simple :

    private static void ProtectFromDrawing(Graphics g,

    Rectangle rect)

    {

    IntPtr hdc = g.GetHdc();

    try

    {

    ExcludeClipRect (hdc,

    rect.Left,

    rect.Top,

    rect.Right,

    rect.Bottom);

    }

    finally

    {

    g.ReleaseHdc(hdc);

    }

    }



    [DllImport("Gdi32.dll")]

    public static extern int ExcludeClipRect(

    IntPtr hdc, // handle to DC

    int nLeftRect, // x-coord of upper-left corner

    int nTopRect, // y-coord of upper-left corner

    int nRightRect, // x-coord of lower-right corner

    int nBottomRect // y-coord of lower-right corner

    );

    You just have to call ProtectFromDrawing at the end of your drawing function.

  12. #12
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 773
    Points : 500
    Points
    500
    Par défaut
    salut ,etant interressé par ton probleme je passe un peu de temps dessus .

    J'utilise la derniere procedure que tu as donné et j'ai pas le meme comportement que toi .

    tu me dit que tu dois passer la souris sur tes items pour qu'ils s'affichent , c'est pas mon cas ! . Mais ce probleme me rapelle un probleme que j'avais eux avec mes popmenus.

    en fait j'avais commencé a ecrire mon appli pour qu'elle tourne sous win98 . et j'avais redessiné tout mes popmenus ... eb passant sous Xp j'avais le probleme que tu decris , il me fallait passer ma souris sur mon menu pour afficher les items et j'ai resolu mon probleme en aujoutant
    dans mes "state"=[odNoAccel]

    si dans ma procedure ci dessous j'enleve [odNoAccel] je retombe dans ton fonctionnement que tu decris.

    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
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    procedure TFTranco.dessineMenu(texte:string;ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
    var Postexte : integer;
    begin
       Postexte:=Arect.Bottom-16;
       Acanvas.font.Name:=Police;
       Acanvas.font.size:=10;
       Acanvas.Brush.color:=calculeColorFlat(Cofonce,25,'U');
       Acanvas.font.color:=CotexteFlat;
       Acanvas.font.style:=[];
     
       if state=[odNoAccel,odselected] then
       begin
            Acanvas.Brush.color:=Coselect;
            Acanvas.font.color:=Coclaire;
       end
       else
       if state=[odNoAccel,odGrayed,odDisabled,odselected] then
       begin
            Acanvas.font.style:=[fsitalic];
            Acanvas.font.color:=CoBenabled;
       end
       else
       if state=[odNoAccel,odGrayed,odDisabled] then
       begin
            Acanvas.font.style:=[fsitalic];
            Acanvas.font.color:=CoBenabled;
       end;
     
     
       Acanvas.fillrect(ARect);
       if texte='-' then
       begin
         Acanvas.Pen.color:=CofonceTitre;
         Acanvas.moveto(0,Postexte+12);
         Acanvas.lineto(Arect.right,Postexte+12);
         Acanvas.Pen.color:=CoClaire;
         Acanvas.moveto(0,Postexte+13);
         Acanvas.lineto(Arect.right,Postexte+13);
       end
       else Acanvas.textout(4,Postexte,texte);
    end;
    je ne sais pas si cela peut d'aider , mais bon qui sait ... lol

    bye bye

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    tu me dit que tu dois passer la souris sur tes items pour qu'ils s'affichent , c'est pas mon cas !
    Est-ce que tu veux dire que les menus s'affichent correctement sans la flèche du sous-menu? Bref que mon code marche chez toi?

    Quelle version de delphi utilises-tu ? moi c'est D6.

    Edit: Un autre usager vient de me confirmer que mon code marche chez-lui.. argggg

  14. #14
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 773
    Points : 500
    Points
    500
    Par défaut
    Chez moi , tous mes items s'affiche bien ( en rouge et blanc )!! par contre j'ai toujours la petite fleche noire quand j'ouvre le menu , et elle s'efface quand je passe la souris dessus !! mais j'arrive pas a trouver l'info qui determine qu'elle devrai s'y trouver , pour la redessiner ... a bientot

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    ah ok..bizarre.

    Pour ce qui est du odnoaccel, puisque je ne vérifie pas le "state" cela ne fait pas de différence.

    Vraiment un problème étrange. Il m'obsède et pourtant c'est rien de si important finalement. N'empêche que j'aimerais pouvoir la dessiner moi-même cette foutue flèche. C'est un peu stupide, mais bon qui suis-je pour affirmer cela ?

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Pour illustrer mon problème voici une petite image

    http://img317.imageshack.us/my.php?image=menu3rn.jpg

    La première illustre ce que je vois lors du popup
    La 2e illustre ce qui est visible quand ma souris descend sur le 2e item et
    prouve que le celui-ci a bien un sous-menu
    La 3 montre le menu au complet une fois que j'ai passé la souris sur tous les items. Notez que la flèche de sous-menu du 2e item n'est pas visible.

  17. #17
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    T'es partit sur une mauvaise piste, t'es en train de dessiner sur le DC et non sur le canvas, de plus utilise DrawText() au lieu de textOut() t'as beaucoup plus de possibilités, voilà un exemple simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    begin
      if Selected then // si l'item est sélectionné 
       ACanvas.Brush.Color := clGradientActiveCaption // on choisi une couleur bleu clair
      else
       ACanvas.Brush.Color := clMenu; // sinon on garde la couleur du menu 
     
      ACanvas.FillRect(ARect); // on paint l'espace de l'item avec la couleur choisi ci-dessus
     
      DrawText(ACanvas.Handle, PChar((Sender as TMenuItem).caption), -1, ARect, DT_CENTER or DT_VCENTER or DT_SINGLELINE or DT_NOCLIP); // puis on dessine le texte avec nos personnalisations 
    end;
    Et maintenant la petite fleche prend la couleur du texte. Si tu veux la remplacer par un glyph de ton choix, ce sera beaucoup plus compliqué. J'y regarderais demain si j'ai un peu de temps et de motivation, ce soir je suis KO ça peu m'interesser par la suite .

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Merci
    Cependant j'ai essayé ton code et la fèche est toujours noire même si la fonte est de couleur bleue.
    Il manquerait pas une ligne dans ton code car je ne vois pas d'instruction spécifiant la couleur de la flèche.

    P.S.
    Je dessinais sur le canvas et non pas sur le dc

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Qqun a du nouveau?

    De mon côté, une recherche additionnelle sur google news me fait retenir 2 choses.

    1. Quand la question était posée dans un groupe delphi on disait la plupart du temps que c'était malheureusement impossible

    2. Quand la question était posée dans un groupe VB on disait qu'il suffisait d'appeler ExcludeClipRect (ce que j'ai fait en Delphi sans véritable succès)

    C'est sûr qu'il y a toujours la solution d'utiliser un menu non tradionnel non descendant de Tmenu mais c'est un peu trop de troubles pour une simple petite flèche

  20. #20
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Voilà, j'ai enfin un truc qui fonctionne mais avec un petit bug. En gros, la seule manière de changer cette fameuse flèche de sous-menu est de prendre la main sur windows et se taper la gestion du dessin des items de menu (pas totalement je te rassure ).
    Le petit bug genant est que quand je passe dans un sous-menu, le menu parent n'est pas redessinné et devient tout blanc, ça doit s'arranger sans trop de difficultés, pour détecter si un sous-menu est présent, tu utilises GetSubMenu() sur l'item en cours de dessin, si celui çi renvoie un handle valide, tu charges ton glyph et tu l'affiches à la place de cette fameuse flèche en utilisant la méthode Draw() du canvas. (Après avoir remplit le fond de l'item biensur)

    Si tu es toujours interessé, je peux te donner mon source de test si tu veux t'y consacrer, moi je fais ça pendant mon temps libre le soir.

    Dès que j'ai un code valable, je le proposerais en FAQ.

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/07/2005, 11h45
  2. Réponses: 7
    Dernier message: 28/06/2005, 12h53
  3. [phpBB] Comment changer les couleurs
    Par ludolecho dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 19/05/2005, 09h20
  4. comment changer la couleur du crayon?
    Par meli0207 dans le forum MFC
    Réponses: 10
    Dernier message: 07/05/2005, 11h41
  5. Réponses: 2
    Dernier message: 01/12/2004, 23h48

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