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

Delphi Discussion :

gestion des contours des png [Archives]


Sujet :

Delphi

  1. #21
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    le problème viendrait-i po de WM_NCACTIVATE ?

    L'avantage du super exemple de l'autre post c'est qu'il utilisait visiblement une commande reconnue (UpdateLayeredWindow) par windows lequel redessinait niquel sans qu'on lui demande l'ojet concerné.

    Soit dit en passant le fait de n'appliquer le code magique qu'à une partie de la fiche et non à tous ses contrôles est visiblement prévu :

    " UpdateLayeredWindow always updates the entire window. To update part of a window, use the traditional WM_PAINT and set the blend value using SetLayeredWindowAttributes."

    mais pour moi c'est du charabia.

    Bon j'ai grillé mon dernier neurone, je fais une pause...

  2. #22
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Bon, j'ai déjà réussi à capturer le bureau sans focus et sans notre form au démarrage du programme avec la fonction SetWindowPos et le paramètre HWND_BOTTOM. C'est un bon début!

  3. #23
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Voilà, je suis arrivé à capturer correctement le bureau en cachant préalablement la form et en déplaçant le focus au dernier plan. J'ai été obligé d'utiliser un timer car c'est le seul moyen que je connaisse pour obtenir une surveillance lorsque le programme est en arrière-plan (à part l'utilisation d'un hook). Mais bon, ça n'est pas encore ça... Je pense continuer demain.

    http://sub0.developpez.com/delphi/alphaform.zip

    [EDIT]
    SetLayeredWindowAttributes permet de rendre la fenêtre plus ou moins transparente, mais l'image est remplacée par la fenêtre. Avec cette fonction, on peut aussi mettre une couleur transparente et donc donner une forme quelconque à la fenêtre. Cela dit, il n'est pas prévu (apparemment) d'appliquer un masque de transparence à une fenêtre...
    dwFlags
    [in] Specifies an action to take. This parameter can be one or more of the following values.
    LWA_COLORKEY
    Use crKey as the transparency color.
    LWA_ALPHA
    Use bAlpha to determine the opacity of the layered window.

  4. #24
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    Merciiiiiiiiiiiiiiiiiiiiiiiiiiii !!!!!!!

    Donc le Timer c'était cool.
    Je l'ai mis à 1 et j'ai un résultat parfaitement acceptable, c'est du bon boulot ! La journée commence bien

    Bon évidemment, ça bouffe 100% de mon PIII 1Ghz quand je déplace ma fiche (même en remettant le Timer à 50)


    Ooops, je me rend compte aussi que si je déplace les boutons et edit sur la fiche mais en dehors des images... ils n'apparaissent pas à l'exécution du coup si je laisse la taille de la form nécessaire (pour qu'elle s'affiche jusque sous les boutons et edit... il faut que j'applique une transparence à la fiche et me revoilà avec mon effet aquatique

    Voilou, je crois que c'est tout pour ma séance test/débeuguage

  5. #25
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    Reste plus qu'à comprendre l'astuce pour utiliser de simples PNG... ? (C'est plus pratique (pour les utilisateurs) et moins lourd (10 kilo mes fichiers png) pour un programme dont on veut permettre la personnalisation visuelle)


  6. #26
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Alors là tu n'y es pas. Les fichiers PNG sont compressés, et pour pouvoir les visualiser, le système est obligé (c'est une certitude) de les décompresser et d'utiliser au final un bitmap. Ce n'est pas du vectoriel là. De plus, tu vois une démo avec laquelle tu n'as pas la possibilité d'afficher le moindre controls dessus... Dans ces conditions, ça me semble normal que se soit fuilde. Cela dit, je pense que mon code peut être optimisé, avec de l'assembleur par exemple (voir librairie Graphic32). En tous les cas, n'espère pas de miracles. A la limite, tu as la possibilité d'essayer de capturer toute la form pour manipuler l'image PNG fusionnée de ton programme, c'est probablement plus fluide au déplacement de la form, mais moins facile à réaliser pour commencer, et la capture, plus l'encode / décodage du PNG prendra aussi du temps... Pas dit que cette méthode soit plus rapide en fait.
    ps: Je viens de corriger certaines choses dans ma démo, essaye-la, à+

  7. #27
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    Bin je suis teubé, il m'a suffit d'élargir la "zone de travail" de l'image, (la partie noire de "Opaque") pour que la transparence vienne jusqu'où mes contrôles sont placés

    Par contre je persiste à utiliser 1 au lieu de 50 pour le timer, est-ce un tord ? (au niveau ressources j'ai l'impression que ça ne change rien...

    En revanche je viens de remarquer un autre bug d'affichage : si à l'écran il existe une fenêtre ayant le fichu paramètre fsStayOnTop alors notre capture en est affecté comme à l'origine (fameux bug d'affichage) on voit alors en arrière plan la fenêtre des programmes qui utilisent fsStayOnTop. Pour voir un exemple il suffit d'utiliser le gestionnaire de tâches (Ctrl-Alt-Suppr) en même temps que "alphaform". Tant qu'on ferme pas le gestionnaire des tâches notre capture n'est pas rafraichie..

    Par ailleurs quand on clique sur le bouton Exit de la fenêtre alphaform alors que celle-ci n'avait pas le focus, alors on doit recliquer une seconde fois pour que cela marche.

    Sinon pour les PNG dis-moi si je me trompe : il suffit donc de transformer le png en bitmap puis de le dupliquer pour en faire un masque sur lequel on applique un antialias ? Mais dans ce cas est-ce qu'on perd la qualité de l'antialias d'origine du png ?

  8. #28
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par DarkChamallo
    Sinon pour les PNG dis-moi si je me trompe : il suffit donc de transformer le png en bitmap puis de le dupliquer pour en faire un masque sur lequel on applique un antialias ? On perd pas la qualité de l'antialias d'origine du png ?
    J'ai l'impression que tu mélanges tout là, ou bien peut-être ai-je mal saisi la question... Je te répond tout de même: Les images PNG sont des images compressées possèdant une image opaque et un masque de transparence. Pour modifier un PNG (par exemple, le redimensionner), il faut extraire l'image opaque et le masque, redimensionner les 2 images séparément, puis refusionner les 2 images pour réobtenir un PNG.

    En ce qui concerne la méthode envisagée qui utiliserait la fonction UpdateLayeredWindow; Nous allons partir du code actuel excepté que nous obtiendrons les 2 bitmaps Opaque et Alpha en décomposant l'image PNG. A ce stade, nous aurons toujours les bugs d'affichage. Seulement, lorsque notre programme perdra le focus, nous le transformerons alors en image PNG avec UpdateLayeredWindow pour éviter les bugs.

    La méthode peut être la suivante : Nous dessinons le canvas de la form (avec les controls) dans l'image opaque du PNG, comme pour une capture, puis nous ajouterons le masque alpha à cette image avant de transformer le tout avec UpdateLayeredWindow. A ce stade, nous ne devrions plus avoir de bugs. Ensuite, lorsque le programme reprend le focus (parce qu'il faut savoir que les controls sont toujours accessibles et actifs même si on dessine par dessus une image PNG), nous réafficherons le programme tel que nous le connaissons.

    En résumé, il faut transformer le programme en PNG uniquement lorsque une autre fenêtre est active. A propos, je crois que j'ai résolu le problème avec les forms stayontop. En fait, le seul bug que j'ai maintenant, c'est que lorsqu'un programme est sur alphaform et qu'on déplace ce programme ou bien qu'on le réduit, alphaform a un arrière-plan buggé par l'image du programme qui l'a superposé. J'espère que tu as tout compris

  9. #29
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    ou bien peut-être ai-je mal saisi la question... (...) En ce qui concerne la méthode envisagée qui utiliserait la fonction UpdateLayeredWindow...
    Heu... en fait moi ton code me convient parfaitement, je ne parlais plus de la méthode employée sur le fameux exemple parfait pour png unique sans contrôle (UpdateLayeredWindow) ...

    La méthode peut être la suivante : Nous dessinons le canvas de la form (avec les controls) dans l'image opaque du PNG, comme pour une capture, puis nous ajouterons le masque alpha à cette image avant de transformer le tout avec UpdateLayeredWindow.
    ...mais vu comme ça ça peut être intéressant (ajouter les contrôles doit être une sacré paire de manche). A creuser. Perso je me cantonne à ce qu'on vient de faire ensemble avec ton alphaform Ou alors je n'ai pas compris on parle bien de ton code là ?

    il faut extraire l'image opaque et le masque
    Si le principe que j'évoquais (bitmap-antialias...) n'est pas le bon que fais-je alors pour mettre dans "Opaque" la partie à voir et dans "Alpha" celle à retirer ?

    En fait, le seul bug que j'ai maintenant, c'est que lorsqu'un programme est sur alphaform et qu'on déplace ce programme ou bien qu'on le réduit, alphaform a un arrière-plan buggé par l'image du programme qui l'a superposé
    Ah oué effectivement, flûte...

    J'espère que tu as tout compris
    Oui sauf l'allusion au décomposage de png et le fait que tu évoques la possibilité d'utiliser ton code pour finalement le finaliser avec UpdateLayeredWindow (ton code suffit, non ?)

  10. #30
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    tu vas comprendre maintenant; Voici la 1ère étape du programme, la form est fusionnée en une seule image avec UpdateLayeredWindow lorsqu'on la déplace (attention, ça ne fonctionne que pour un seul déplacement, puisque le code inverse n'est pas encore implémenté). Tu remarqueras simplement que la form ne peut plus bugger après sa fusion, et que le memo ne fonctionne plus (normal puisque plus de focus possible) mais que l'action du bouton exit fonctionne toujours.

    http://sub0.developpez.com/delphi/alphafusion.zip

    A suivre

  11. #31
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    Heu... exact...

    mais là j'ai l'impression qu'on redémarre de zéro et que tout reste à faire

    Perso si on vire le dernier beugue qu'on rencontrait (avant d'utiliser UpdateLayeredWindow) ton code me convenait parfaitement

  12. #32
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Apparemment, il n'ya pas d'autres solutions que de passer par UpdateLayeredWindow pour résoudre ce problème.

  13. #33
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    N'y'a-t-il pas un code magique qui permet de savoir si une fenêtre passe au dessus de la nôtre ? soit en disant If(passe-par-dessus telle fenêtre) then... ou alors If(passe-par-dessus cette zone de l'écran où se trouve ma fenêtre) then...

    ?

    Un évenement qu'on mettrait dans le timer...

    Une sorte de OnFormOver

    ...Et si on utilise le SetWindowPosBidule (fsStayOnStop ou stayOnBottom) ça se trouve on ellimine le problème ? (Heu... apparament non )

  14. #34
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Peut-être que ça t'irait ça, malgré que ce soit du VC++ apparemment, ça nous aiderait si ça fonctionne :
    http://www.codeproject.com/gdi/pxalphablend.asp
    http://www.codeproject.com/dialog/screenmate.asp
    Pour l'instant, je pense essayer de finir ce que j'ai commencé, on verra après...

  15. #35
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    ? heu, oui j'ai vu ça cette nuit mais c'est pas le code d'où vient le post concernant UpdateLayeredWindow en C traduit en delphi ? Bon, j'ai téléchargé les sources, je jette un oeil...

  16. #36
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56

  17. #37
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    Sur cette url il y a un exemple utilisant UpdateLayeredWindow... qui affiche en même temps 2 boutons. Je mets ça au cas où..

    Http://Www.Am-Ende.Net/Delphi/AlphaEffects/

  18. #38
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    Dans le genre je n'y connais rien mais je cherche une solution :

    Et si on utilise les hook ?

    http://delphi.about.com/od/windowssh.../mousehook.htm

    dans cet exemple alors que la form n'est pas active, elle est capable de détecter la position de la souris...

    ...si on peut détecter qui passe au-dessus de notre fenêtre, le tour est joué, on relance un rafraichissement de la capture, non ?

  19. #39
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Le pass ne fonctionne pas (enfin je suppose que c'était pour les démos en VC++). Bref, la démo que tu as trouvé fait une capture des boutons dans l'image avant d'appliquer le layer... Donc ce n'est pas encore ça. Pour l'histoire du hook, je vais essayer puisque tu insistes.

  20. #40
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    C'est marrant, c'est un concept qui a déjà été abordé pour autre chose : http://www.developpez.net/forums/sho...light=survoler et il n' y a pas eu de solutions...

    Tu ferais 2 heureux d'une pierre 2 coups !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [GRAPH] [GCHART] Couleur des contours des barres d'histogramme
    Par mohamed_ dans le forum ODS et reporting
    Réponses: 2
    Dernier message: 02/09/2011, 11h18
  2. Réponses: 3
    Dernier message: 30/06/2009, 20h16
  3. Réponses: 2
    Dernier message: 24/01/2008, 00h56
  4. Réponses: 19
    Dernier message: 20/12/2006, 11h15
  5. Gestion des majuscules des miniscules des accent
    Par issam16 dans le forum Access
    Réponses: 2
    Dernier message: 13/07/2006, 15h21

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