Effet "glass" et composants ?

Résolu
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 28 nov. 2009 à 06:24
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Derniè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 :



Et en VB.NET avec le subclassing :



Vous constatez bien la différence
Merci à vous

Cordialement, Bacterius !

12 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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);

sinon
  Windows.DrawTextW(DC, Text, Length(Text), TextRect, TextFlags);

ce n'est qu'une petite partie du code en guise d'exemple
Dans les nouvelles versions de Delphi la VCL gère le 32bit et le style Aéro




[hr]@+Cirec
[hr]
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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.

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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 :/

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 nov. 2009 à 13:36
Premier essai infructueux mais bon tout problème a une solution ...

Cordialement, Bacterius !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 nov. 2009 à 13:37
Bonne nouvelle ! J'ai trouvé l'unité Themes.pas sur D7

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 nov. 2009 à 01:10
Bon ben ça progresse j'arrive à dessiner des trucs comme des boîtes à cocher ou des boutons sur la surface vitrée

Cordialement, Bacterius !

0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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

Cordialement, Bacterius !
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
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 ^^
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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

Cordialement, Bacterius !
0
eclems Messages postés 104 Date d'inscription samedi 23 décembre 2000 Statut Membre Dernière intervention 9 mai 2013
30 nov. 2009 à 20:16
ca peut etre pas mal il sera compatible aussi sous XP et D7?
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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 ..

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
14 déc. 2009 à 09:12
Bon, j'ai réussi à faire fonctionner à peu près tous les composants par une méthode un peu agressive mais bon ...

Cordialement, Bacterius !
0
Rejoignez-nous