Coordonées d'un TMenuItem

Résolu
cs_saib Messages postés 38 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 15 mars 2010 - 1 août 2004 à 16:54
cs_saib Messages postés 38 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 15 mars 2010 - 29 août 2004 à 02:20
Salut
Voila je suis en train d'essayer d'ecrire un composant derivant de de TPopupMenu mais ayant une propriété AlphaBlend pour gerer une transparence partielle

J'utilise l'evenement OnDrawItem des TmenuItems de ce PopupMenu pour dessiner ce que je veux sur l'Item car les evenements OnDrawItem et OnAdvancedDrawItem fournissent un Canvas correspondant a l'item
On oublie tout de suite l'idée du Canvas.brush.style := BsClear car il y a un espece de sous-couche grise a laquelle on a pas acces (ou alors si quelqu'un a une solution dans ce sens je suis preneur :) )

L'idée, donc, c'est de capturer l'image de la zone ou va apparaitre le TMenuItem pour la redessiner sur le Canvas fourni par OnDrawItem, mais la, probleme, on a aucune propriété de position ou de point ou quoi que ce soit qui fournirait un indice sur la position de l'item, et la fonction de l'API GeMenuItemRect fournit un TRect situé en haut a gauche de la Form ou est placé le menu!!!

Donc voila, si quelqu'un a une astuce pour rendre un TMenuItem transparent ou pour recuper sa position, ca sauverait mes pauvres nerfs qui commencent a craquer!!!

Merci!

saib

1 réponse

cs_saib Messages postés 38 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 15 mars 2010
29 août 2004 à 02:20
Bon ben j'ai trouvé ma solution, et sans passer par la position et la capture d'ecran.
le PopupMenu (ainsi que pas mal d'autres composants visuels comme par exemple les TButton) sont en fait directement crees par windows, et ne sont rien d'autres que des fenetres. Plus exactement, a partir de windows 2000, des LayeredWindow, ce qui fait qu'on peut utiliser UpdateLayeredWindow pour definir la transparence globale, mais mieux que ca, on peut en fait dessiner l'image du PopupMenu dans un TBitmap avec un PixelFormat en 32 bits (donc avec une valeur Alpha pour chaque pixel) et ainsi definir un niveau de transparence au pixel pres!
ca ouvre pas mal de perspectives, notament pour pouvoir faire, pourquoi pas, des descendants de TButton skinables, non rectangulaires, avec une ombre, un degradé de transparence ou n'importe quoi d'autre! il suffit d'y appliquer la technique des skins!

Je suis en train d'essayer de le faire sur le composant que je suis en train de develloper, mais y'a un petit probleme : un Popup menu n'a pas forcement une taille predefinie, on peut y ajouter ou enlever des elements, ou modifier le texte, donc il faut que je trouve un systeme pour que le skin ressemble encore a quelque chose si le menu est modifié (si quelqu'un a une idee je suis preneur).
En plus, UpdateLayeredWindow impose de redessiner la totalité du popupMenu, donc si il contient beaucoup d'elements, ca risque de bouffer pas mal de ressources et de ralentir l'affichage... (si quequ'un a une idee pour ca aussi...)

Enfin, je continue a bosser dessus et quand il sera terminé, je le mettrait sur le site ;)

saib
3
Rejoignez-nous