begin process at 2010 02 10 08:42:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > ALPHA UTILS

ALPHA UTILS


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :alpha, blending, API, layered, handle Niveau :Initié Date de création :16/01/2009 Date de mise à jour :25/01/2009 20:15:52 Vu / téléchargé :2 234 / 315

Auteur : Bacterius

Ecrire un message privé
Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Bonjour !

Comme vous le savez, tout objet interactif dans Windows (boîtes de saisie, boutons, liste déroulante, etc ...) possède un Handle - c'est à dire un descripteur de fenêtre, qui peut être utilisé dans des API telles que SendMessage, Set/GetWindowLong, etc ...
Parlons de Set/GetWindowLong, qui permet de récupérer et de définir tout un tas de trucs pour une fenêtre (qui désigne tout objet interactif dessiné dans Windows) donnée, en spécifiant son handle (descripteur de fenêtre). Il est possible de définir un style de fenêtre, qui peut être une combinaison de multiples constantes. Définissons par exemple ... la constante WS_EX_LAYERED [$00080000]  - non déclarée dans Windows, il faut la définir soi-même. Elle permet d'activer le style "layered", et permet à la fenêtre d'être utilisée dans des API telles que GetLayeredWindowAttributes et SetLayeredWindowAttributes (non déclarées dans Windows encore une fois, il faut les appeller soi-même depuis User32.dll), qui permettent de définir les "layered attributs" de la fenêtre passée en paramètre.
Nous arrivons au vif du sujet : qu'est-ce que les "layered attributes" ? Eh bien c'est un certain nombre de paramètres qui définissent la façon dont Windows doit gérer une fenêtre "layered" et son "environnement graphique" (les fenêtres qui sont probablement derrière la fenêtre "layered"). En gros, c'est un AlphaBlend. Windows regarde si telle ou telle fenêtre possède un style incluant WS_EX_LAYERED, et si c'est le cas, il la dessine en alphablend, selon le paramètre LWA_ALPHA [$00000002] (non définie dans Windows, oh la la quel travail de porc cette unité ^^ ...). Pour ceux qui ne le savent pas, l'alphablend est le principe de mélanger deux couleurs entre elles pour obtenir un fondu (exemple : du bleu sur du vert donne du jaune). Néanmoins, pour pouvoir gérer sa propre fenêtre "layered" (qui peut ne pas vous appartenir bien sûr !), il faut d'abord faire un certain nombre de choses.
C'est pourquoi je vous ai concocté une unité Alpha Utils qui permet de gérer très facilement une fenêtre "layered", en vous offrant toutes les routines nécessaires à la gestion d'une telle fenêtre, ainsi que quelques outils pour retrouver facilement quelques descripteurs de fenêtres.
Je vais vous résumer rapidement les étapes de la gestion d'une fenêtre "layered", de façon très générale :

1) On cherche un descripteur de fenêtre parmi le fouillis indescriptible de notre mémoire vive => allez, appellons-le HANDLE ^^.

2) On prépare la fenêtre identifiée par HANDLE à accepter les layered attributes en utilisant PrepareLayering (notez qu'il est possible de spécifier si l'on veut forcer la fenêtre à passer en layering - ça ne marchera pas toujours).

3) On va faire joujou avec le paramètre LWA_ALPHA de notre fenêtre. On va modifier, à notre gré, la valeur alpha de ce paramètre, pour définir avec quelle intensité Windows va appliquer le fondu (0 = totalement invisible (ne répond même plus aux évènements utilisateur), 255 = opaque). On peut même récupérer son état à n'importe-quel moment avec GetWindowAlpha, et le définir avec SetWindowAlpha.

4) Une fois qu'on en a assez, on appelle ReleaseLayering. Cette fonction aura pour effet de rétablir le style initial de la fenêtre.

Remarque : on peut eventuellement utiliser la fonction SupportsLayering, qui permet de savoir si la fenêtre choisie supporte déjà le layering (évite un appel inutile à PrepareLayering si SupportsLayering renvoie True).

Quelques routines utiles pour récupérer divers descripteurs de fenêtre :

- GetTrayHWnd, récupère le descripteur de fenêtre de la barre des tâches
- GetDesktopHWnd, récupère le descripteur de fenêtre du bureau
- GetHWndByWindowName, récupère le descripteur de fenêtre d'une fenêtre si l'on connaît son nom
- GetHWndByWindowClassName, récupère le descripteur de fenêtre d'une fenêtre si l'on connaît son nom de classe
- SearchHWnds, récupère dans un TList les handles de toutes les fenêtres de votre système ! [EnumWindows]

J'ai fourni un petit exemple, qui permet de rendre la barre des tâches transparente, ainsi qu'un petit bonus, pour rendre votre fiche transparente SANS l'utilisation des propriétés AlphaBlend et AlphaBlendValue.
J'ai également mis une option pour lister soit toutes les fenêtres, soit seulement la barre des tâches et notre fiche ...
J'ai mis une capture, que j'ai prises au moment de mettre ma source sur DelphiFr. Notez que j'ai mis en fond d'écran un dégradé, pour bien faire ressortir la transparence de la barre.
__________________________________

NOUVEAU [SAMEDI 17 JANVIER 2009] :

Ajout d'une classe TLayeredWindow pour gérer d'une façon extrêmement simple une fenêtre "layered". Il suffit de créer la classe TLayeredWindow avec un descripteur de fenêtre en paramètre (ainsi que quelques autres paramètres utiles), et elle fera tout pour vous. Elle s'occupera même de la destruction de l'objet et du retour à l'ancien style. Une fois que vous aurez créé l'objet (pensez à le détruire par Free), vous aurez accès à un certain nombre d'informations sur la fenêtre. Voici ce que contient TLayeredWindow :

- Accès au descripteur de fenêtre, possibilité de le modifier sans recréer soi-même une classe TLayeredWindow
- Accès au nom de classe de la fenêtre (dans mon exemple, on aura "Shell_TrayWnd" et "TMainForm")
- Accès au descripteur de fenêtre du parent (lecture seule)
- Accès au nom de classe du parent (lecture seule)
- Accès en lecture seule à l'ancien style de la fenêtre (si vous voulez faire quelque chose avec ??)
- Accès à une propriété qui indique si la fenêtre supportait le layering avant de la forcer à le supporter
- Accès à la valeur alpha de la fenêtre (modification en temps réel)
- Accès à une propriété qui indique si la fenêtre est capable de modifier sa transparence, même en forçant le layering
- Accès à une propriété qui indique si le descripteur de fenêtre pointe bien vers une fenêtre visible
- Accès à une propriété (que vous pouvez modifier) qui indique si l'on doit rétablir l'état initial de la fenêtre une fois la manipulation terminée)
- Accès à une propriété qui indique l'état de la fenêtre (répond/ne répond pas), lecture seule, cela va de soi ^^'.
- Possibilité de choisir si cette classe sert juste pour récupérer des informations sur la fenêtre (on ne touchera pas aux layered attributes - évitera un sale clignotement noir, et eventuellement des problèmes de redessinement)), ou alors si elle sert bien à modifier la transparence de la fenêtre.

Je vous ai même mis un pointeur typé TLayeredWindow, mais il est inutile pour l'instant (peut-être plus tard ??).

Bien sûr, il est possible de contourner cette classe et d'utiliser directement les fonctions PrepareLayering, GetWindowAlpha, etc ... Mais votre code sera considérablement allégé si vous utilisez la classe TLayeredWindow.

Une documentation très complète sous forme de HTML est fournie dans le zip. Lisez-là si vous n'êtes pas à l'aise avec les descripteurs de fenêtres et tout ça ...
Une DLL est fournie pour la compatibilité avec les autres langages (l'unité réservée à la DLL - AlphaUtilsUnit.pas - a été spécialement optimisée pour la DLL).
__________________________________

J'ai probablement oublié des trucs dans la description, merci de me le rappeller :)
Bon amusement ! (cette unité Alpha Utils est tout à fait libre, je voudrais juste que vous gardiez le header (le paquet de texte en commentaire avec la déclaration de l'unité), et que vous m'informiez avant de distribuer une application la contenant. Il en va de même pour l'unité réservée à la DLL).

Merci à tous :)


 Conclusion

Tous critiques, commentaires, remarques, conseils, etc ... ici :)

Cordialement, Bacterius !

PS : Codé sous Delphi 6 Personal Edition.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

16 janvier 2009 23:39:12 :
// Quelques abberations dans le code ...
16 janvier 2009 23:41:30 :
// J'ai rajouté une autre bêtise ...
17 janvier 2009 14:18:28 :
// Ajout de la classe TLayeredWindow, et mise à jour de l'exemple + description
17 janvier 2009 14:35:38 :
// Boucle infinie :/
17 janvier 2009 16:15:05 :
// Quelques bugs + ajout d'une listview pour afficher toutes les infos de la barre des tâches et de notre fiche
17 janvier 2009 17:28:18 :
// Grosse amélioration : découverte de l'annulation d'un OR par un autre OR ^^'
17 janvier 2009 17:41:07 :
// Voir commentaire
17 janvier 2009 18:05:16 :
// Il suffisait d'une petite vérification de condition (bug précédent : décalage constant => hors application : style layered / dans application : pas de style layered). Cette fois c'est la bonne !
17 janvier 2009 20:48:57 :
// Assez grosse mise à jour, avec beaucoup de modifications : plus d'options dans la treeview, ainsi qu'une plus grande stabilité de la barre des tâches : maintenant, tout fonctionne, la barre des tâches retourne dans son état initial après, etc ... Ca devrait être bon ce coup-çi !
17 janvier 2009 20:51:09 :
// Assez grosse mise à jour, avec beaucoup de modifications : plus d'options dans la treeview, ainsi qu'une plus grande stabilité de la barre des tâches : maintenant, tout fonctionne, la barre des tâches retourne dans son état initial après, etc ... Ca devrait être bon ce coup-çi ! (+ petite abberration au niveau du menu popup).
17 janvier 2009 21:21:00 :
// Ajout de l'API IsHungAppWindow + mise à jour de la treeview.
18 janvier 2009 01:46:30 :
// Grosse maj : voir commentaire
18 janvier 2009 02:05:50 :
// Mini bug
19 janvier 2009 19:56:28 :
// MAJ (gros bug) + amélioration
19 janvier 2009 21:30:43 :
// Ajout de la doc
20 janvier 2009 21:58:09 :
// Changement GetNextWindow => EnumWindows
21 janvier 2009 20:03:07 :
// Quelques optimisations + DLL
25 janvier 2009 20:15:54 :
// Ajout des fichiers manquants

 Sources du même auteur

Source avec Zip Source avec une capture UNITÉ DE SUPPORT VISTA
Source avec Zip Source avec une capture GESTION DES "CRASHS D'APPLICATION"
Source avec Zip Source avec une capture CONJECTURE DU CARRÉ DES FACTEURS
Source avec Zip Source avec une capture EFFET VITRE ET THUMBNAILS SOUS VISTA
Source avec Zip Source avec une capture UTILISER UNE DLL INCLUSE EN RESSOURCES

 Sources de la même categorie

Source avec Zip NEXTGENS -> UNITÉS DE TYPES ÉVOLUÉS NOUVELLE GÉNÉRATION (DE... par f0xi
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip CARDS GAME SDK 1.0.0.0 par f0xi
Source avec Zip Source avec une capture TRAYICON - VOTRE ICONE DANS LA BARRE DES TACHES par Bacterius
Source avec Zip Source avec une capture WINHIDER _ CACHER UN PROGRAMME DE L'ÉCRAN ET DE LA BARRE DE ... par soldier8514

 Sources en rapport avec celle ci

Source avec Zip OBTENIR LE PROPRIÉTAIRE D'UN FICHIER (WIN32;NTFS) par ILP
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip Source avec une capture BITMAP 32BITS INTÉGRÉ À LA VCL (TIMAGE, TPICTURE, TBITMAP, T... par cirec
Source avec Zip Source avec une capture CAMFROG HANDLES OP par yannfrance
Source avec Zip Source avec une capture PACKAGE MICROSOFT par blueperfect

Commentaires et avis

Commentaire de Bacterius le 16/01/2009 23:39:47

J'ai corrigé une petite aberration dans le code !

Cordialement, Bacterius !

Commentaire de Bacterius le 17/01/2009 16:17:46

Correction de quelques bugs (entre autres, ne jamais suffixer Destroy de Reintroduce, mais plutôt de Override).
Ajout d'une petite treeview (oui je me suis trompé dans l'historique) pour lister les informations sur la barre des tâches et sur notre fiche ...

Cordialement, Bacterius !

Commentaire de offlake le 17/01/2009 16:54:59

ce n'est pas une source si on laisse pas les gens s'exprimer !!
BY OFFLAKE

Commentaire de PCPT le 17/01/2009 17:56:17 administrateur CS

Bacterius -> effectivement c'est pas très utile de poster 10 comms pour dire qu'il y a une maj du bug que la maj d'avant vient de provoquer. à la réflexion faudrait même prendre un peu de temps avant de faire des maj :)
idem avant de valider des posts :)

offlake -> je supprime ta note (1/10) que tu ne justifies pas.
si tu as des problèmes avec un ou plusieurs membres (je t'aurais bien proposé de voir çà avec eux mais c'est même pas la peine) viens me voir en MP.
faire des copier/coller de remarques que certains membres t'ont fait et que tu n'as pas comprises n'amènera personne nulle-part!

merci

Commentaire de Bacterius le 17/01/2009 18:00:26

Lol Offlake tu m'as donné une note de 29/10 ^^ (avec ta formule).

Oui en effet PCPT, je ne me rends jamais compte du nombre de posts que je déposes.
Dorénavant je ne posterai un commentaire que dans une grosse MAJ, et je laisserai l'historique faire le reste.

Merci pour le retrait de la note PCPT :)

Cordialement, Bacterius !

Commentaire de cantador le 17/01/2009 22:55:19

@Bacterius:
Peux-tu préciser ce que tu as voulu faire avec la barre des tâches..

Commentaire de Bacterius le 18/01/2009 00:19:13

Euh oui, zut : la rendre transparente (à un degré alpha modifiable) ^^' (on parle, on parle et on oublie l'essentiel !).

Cordialement, Bacterius !

Commentaire de Bacterius le 18/01/2009 01:49:44

Grosse MAJ, la dernière de la journée (d'hier bien sûr huhuhu) :

- ajout d'une fonction dans Alpha Utils qui permet de lister tous les handles de toutes les fenêtres du système dans un TList (j'en tire avantage - je remplace les pointeurs par des handles !) + ajout d'une option dans l'exemple, qui permet soit de lister les deux fenêtres (barre des tâches + notre fiche), soit toutes les fenêtres du système (par leur nom de fenêtre, ou à défaut, leur descripteur de fenêtre !).
Possibilité de choisir si la classe peut modifier la transparence de la fenêtre, ou alors si elle est juste là pour recueillir des informations sur la fenêtre (évite un clignotement noir à la première définition de la transparence).
Il y a des trucs très interessants dans les informations de la fenêtre (adresse fichier du module de fenêtre, par exemple ...).

Cordialement, Bacterius !

Commentaire de Francky23012301 le 18/01/2009 13:42:12

Source intéressant et qui devrait plaire à plus d'un. Il reste des coquilles (Avertissements et conseils du compilo). Au niveau des commentaires tu devrais les mettre "au-dessus" et non sur le "coté". En tout cas niveau commentaires tu n'as pas été radin ;).

Commentaire de cantador le 18/01/2009 13:57:12 8/10

Bravo bacterius pour ce travail même si la transparence présente pour ma part un côté plus spectaculaire qu'utile..

La suite pourrait être un traitement des Skins ?

Commentaire de Bacterius le 18/01/2009 14:11:22

@Francky : oui, parles-tu des 10 conseils "ChildNode n'est pas utilisé" ? En fait il est créé dans la vue arborescente mais jamais utilisé, je vais peut-être faire une ligne ChildNode := ChildNode pour balayer ces "coquilles". Et j'ai essayé de bien tout commenter. Pour la position des commentaires, il est vrai que quand les instructions sont trop longues il faudrait les placer au-dessus ou en dessous, je vais m'y atteler. Merci :)

@Cantador : Merci ! En effet la transparence ne sert pas à grand chose à part rendre le bureau plus joli ... surtout que certaines fenêtres ne se redessinent plus avec WS_EX_LAYERED (comme le fond d'écran, qui devient noir).
Un traitement des Skins ? Qu'est-ce ?

Bon ben je vais m'atteler à tout ça :
Améliorations prévues sur ce code : réorganisation des commentaires, traitement des skins, nettoyage des coquilles.
Nouvelles sources en vue : unité qui liste toutes les API de Windows (il y en a au moins 40% qui ne sont pas déclarées par défaut).

Cordialement, Bacterius !

Commentaire de Francky23012301 le 19/01/2009 08:26:40

Oui je parle de ça et d'une variable non utilisée ;)

Commentaire de cantador le 19/01/2009 09:54:29

"Un traitement des Skins ? Qu'est-ce ?"
C'est la possibilité de créer des formes personnalisables avec des frises, changer les menus, les boutons etc..(Il y a déjà des compos (non free) qui le font mais ils sont vraiment lourdingues)
Il s'agit d'un autre programme qui pourrait peut être réalisé à partir des "layers attributes".
Attention, c'est un très gros boulot de paramétrages.

Commentaire de Bacterius le 19/01/2009 18:40:03

Tu veux dire un accès direct à tous les composants de la fenêtre ! C'est la mort ça : il faut déjà les lister (bon rien de bien méchant jusque là ... petit EnumChildWindows), ensuite il faut vérifier si on connaît la classe de chaque composant (va donc récupérer les propriétés d'un TAVGApplication !), puis ensuite, il faut proposer une propriété pour chaque entrée ... argh.
A moins que ce ne soit pas du tout ça ?

@Francky : j'arrange ça de suite !

Cordialement, Bacterius !

Commentaire de Bacterius le 19/01/2009 20:02:48

Bon voilà Francky : tout est arrangé : je me suis rendu compote que ChildNode ne servait strictement à rien (pas besoin d'utiliser ChildNode après, d'où l'erreur, et la non-nécessité de stocker l'élément liste dans une variable).
J'ai également fait de la publicité à mon nom (il en faut ...), en important dans le projet une BactBar ! (vous vous souvenez, celle qui était dans mon BaktPack !).
Elle permet de suivre en temps réel le listage des fenêtres (parfois c'est long ...).
J'ai également noté un bug : quand on listait toutes les fenêtres, la barre des tâches et notre fiche (je veux parler des TLayeredWindow dans l'exemple, dédiés pour ces deux fenêtres) perdent la main sur la transparence (au profit de la TLayeredWindow temporaire "Wnd"), et ne la reprennent pas une fois Wnd libérée (résultat : il faut redémarrer l'appli). Tout cela est arrangé : le programme fait exprès de ne pas lister la fiche et la barre des tâches (en regardant le handle de la fenêtre à ajouter et à comparer avec les handles de la barre des tâches et de la fiche), puis les liste tout à la fin, à partir de Tray et Form. (Vous n'avez probablement rien compris, moi non plus).

En tout cas ... voilà.

Cordialement, Bacterius !

Commentaire de Bacterius le 21/01/2009 20:05:30

Attention attention : optimisation d'un petit peu de code ...
Et une grosse nouveauté : l'ajout d'une DLL pour assurer la compatibilité avec les autres langages (et puis pour le fun d'en faire une, j'en ai rarement fait). Elle contient toutes les fonctions de Alpha Utils, ainsi que la classe TLayeredWindow, et possède une unité réservée (AlphaUtilsUnit.pas) qui a été spécialisement optimisée pour marcher avec la DLL et avec les autres langages - ne pas trop toucher à cette unité.

Cordialement, Bacterius !

Commentaire de gege58 le 25/01/2009 19:09:58

Bonjour,

après compilation, il me dit fichier introuvable " BactBarImgs.res " ??

je n'ai peut-etre pas tout compris, mais je n'ai pas vu ce fichier.
Merci d'avance de tes explications.

Commentaire de Bacterius le 25/01/2009 19:12:47

Mince !
Je vais manger et je mets ce fichier direct après.
Essaye de virer tout ce qui touche à la "Bactbar" en attendant pour compiler.

Cordialement, Bacterius !

Commentaire de Bacterius le 25/01/2009 20:16:44

Voilà Gege58, tu peux compiler maintenant :)

Cordialement, Bacterius !

Commentaire de gege58 le 25/01/2009 20:48:54

Ca marche, merci beaucoup ! et bonne prog.

Commentaire de Bacterius le 25/01/2009 20:55:56

De rien, dis-moi ce que tu en penses :)

Cordialement, Bacterius !

Commentaire de gege58 le 25/01/2009 21:23:16

Re-Bonsoir,
le code est vraiment bien commenté, l'effet est joli, mais c'est vrai que c'est plus de l'esthétisme que du fonctionnel. Mais c'est sympa quand même, et puis cela fait un bon exemple.
A+

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Les Api Windows [ par twoupy ] Est-ce que quelqu'un possède ou sait où je pourrais trouver l'aide sur les Api Windows (win32.hlp) en français. ce serait bien cool, parce que l'angl documentation API [ par Noureddine ] Bonjour,je cherche la documentation pour comprendre L'API, si vous avez une adresse ou je peut télécharger une documentation en français SVPMerci. Handle [ par SMoG ] une bonne documentation sur les handle ? merci ;)SMoG problème avec une api [ par fabiin ] SalutEst-ce que kelk'un rencontre un problème lors de l'utilisation desetDCbrushcoloren Delphi 6Merci par avance@+Fabse Comment utiliser une API avec Delphi 5? [ par Manthis ] Salut,Je débute tout juste en Delphi 5. J'avais commencer par le VB. Et donc voila j'ai un problème comment utiliser une API avec Delphi?Ou doit-on la Handle [ par Vinch ] Bonjour à tous,J'ai une erreur lors d'un ajout d'un enregistrement dans ma base access depuis delphi, il me met:"Erreur lors de la création du handle API sndPlaySoundA [ par jlg75 ] j'utilise l'API 'sndPlaySoundA' tirée de 'winmm.dll' pour lire des .wav dans un prog DELPHI. Je déclare explicitement cet API comme fonction 'external Recup texte d'une statusbar par handle/classe [ par replic ] salut, j'aimerai recuperer le texte de la statusbar d'une application en execution. Puis-je y arriver par l'intermediaire du handle de celle et de la CHERCHE TUT DELPHI API [ par golum ] Salut je suis a la recherche d'un tut Delphi et API un peu comme EstDev pour VBAuriez vous quelque chose ? des adresses ? Winsock [ par SMoG ] Yop... Je desespere de trouver un jour de la doc sur l'api winsock avec des exemples delphi...Si qqn pouvait m'expliquer comment deux machines se con


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,920 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales