Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 2016
-
28 nov. 2009 à 06:24
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 2016
-
14 déc. 2009 à 09:12
Salut à tous,
je suis en train de vous concocter une source sympathique accompagnée d'un tutoriel, mais je rencontre tout de même un souci technique. Vous connaissez l'effet "glass" de Vista (j'ai d'ailleurs fait une démonstration dans une de mes dernières sources) ?
Eh bien, le problème que j'ai mentionné, à savoir l'impossibilité de poser un composant dessus sans qu'il voie ses couleurs massacrées. Je me demandais si vous n'aviez pas une idée ?
Le problème vient du fait que Delphi ignore totalement le canal alpha lors du dessin des composants VCL sur la fiche. Les valeurs alpha de chaque pixel sont toujours initialisées à 0. Or, Vista fait que l'effet "vitre" se dessine exclusivement sur des surfaces avec une valeur alpha de 0. Du coup tout ressort difficilement.
Pour l'instant je ne peux poser qu'une progressbar (qui ne se dessine pas trop mal), mais j'aimerais bien mettre des boutons ou des labels ... J'ai remarqué qu'en VB.NET il y avait une méthode de "subclassage" qui marche impeccable, mais je me demande si c'est possible en Delphi ? Je n'ai rien trouvé comme informations sur ce point, sur le net.
J'inclus des exemples de ce que ça donne en Delphi, sans rien :
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 28 nov. 2009 à 10:32
Salut,
à mon avis c'est ton D6 le coupable ...
il ne restitue déjà pas correctement le style XP avec le manifest.
Si tu veux (par exemple que le texte d'un TLabel s'affiche correctement il faudra reprendre le code de la VCL :
- tester si l'application est "themé"
si oui avec quelle version de Windows (XP, Vista ++)
si le theme est utilisé :
with ThemeServices.GetElementDetails(teEditTextNormal) do
DrawThemeTextEx(ThemeServices.Theme[teEdit], DC, Part, State,
Text, Length(Text), TextFlags, TextRect, Options);
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 nov. 2009 à 10:45
Cirec, ça fait pareil jusqu'à D2007 où Borland s'est décidé à implémenter tout ça ...
Mais quelle unité utilises-tu pour les ThemeServices ? D6 ne dispose ni de "Themes" ou "UxTheme", et je me suis senti obliger d'implémenter les API à la main pour un résultat nul (impossible d'utiliser la toute première ...).
Je vais regarder sur D7 si il n'y a rien ... (je ne peux plus l'utiliser à cause de "clef invalide", mais j'ai toujours les unités )
J'ai essayé la fonction DrawTextW, même résultat. Il faut (d'après les nombreux sites que j'ai visité) utiliser GDI+ pour dessiner avec un canal alpha différent de 0.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 nov. 2009 à 13:28
Dommage j'ai pas l'unité Themes je vais la chercher sur internet
Ah oui je me rappelle de cette source ^^, je vais voir si je peux faire quelque chose autour de ça, ça serait pas mal de pouvoir ne serait-ce que dessiner sur le verre, ça permettrait de faire comme un label et une image, et puis un TEdit à la rigueur :/
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 29 nov. 2009 à 10:43
Bon ben j'ai trouvé une alternative : je surcharge le dessin des composants et je force le canal alpha 32-bit à 255, na !
Voici le bilan (sacrifices, victoires, ...) :
- TButton : fonctionnel dans la surface vitrée, sauf qu'il faut lui donner un DoubleBuffered sinon il scintille fréquemment (avec le double-buffered, on perd l'effet de "fondu" quand on passe la souris dessus, mais bon).
Note : un bouton de type CommandLink ne peut pas être intégré sur la glace du fait de la trop grande complexité des effets graphiques.
- TLabel : fonctionnel dans la surface vitrée, mais les polices ne rendent pas forcément "super" (mais bon c'est pas non plus horrible)
- TProgressbar : parfaitement fonctionnel dans la surface vitrée, rien à dire.
- TComboBox : parfaitement fonctionnel dans la surface vitrée uniquement si son Style = csDropDownList, sinon c'est impossible.
- TCheckBox : fonctionnel, avec les mêmes limitations niveau polices que le TLabel.
- TRadioButton : fonctionnel, pareil que TLabel.
- TEdit : impossible
- TMemo : impossible
- Tout autre composant non mentionné : sûrement impossible mais non supporté
Donc voilà, avec un minimum d'efforts on arrive bien à faire des choses
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 30 nov. 2009 à 15:39
Ca a l'air sympa ce que tu nous fait :)
Peut être ça va m'aider dans mon problème non résolu de septembre ... : faire une form détourée avec png et canal alpha -_-
oui, personne n'a trouvé, et Foxy n'a pas daigné répondre SALAUD ^^
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 30 nov. 2009 à 19:52
^^
En fait je fais une unité "Vista" pour supporter à peu près toutes les fonctionnalités nouvelles de cet OS afin que nos applications Delphi < 2007 n'aient pas l'air de sortir désagréablement du lot ... Il suffira d'ajouter l'unit dans la fiche et à modifier les propriétés des composants au run-time
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 1 déc. 2009 à 00:51
D7, oui, mais XP ... je sais pas, justement l'intérêt c'est de supporter Vista, il n'apportera donc rien à XP (pas d'effet "glass", pas de TaskDialog, pas de progressbar de plus états, pas de commandlinks, etc ...). Toutes les nouveautés ont été apportées dans Vista, donc je ne sais pas si c'est intéressant de fournir une compatibilité descendante XP. Vos avis ? Je pense qu'il faut quand même le faire comme ça l'application pourra tourner bien sur Windows Vista mais n'aura pas de problème sur les versions antérieures de Windows ..