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

C++Builder Discussion :

Image PNG et fond transparent


Sujet :

C++Builder

  1. #1
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut Image PNG et fond transparent
    Bonjour,

    Je pense avoir épuisé toutes les ressources mises à ma disposition et je ne sais plus ou chercher.
    Google, les Faqs, Tutos et autres n'ont plus de secret pour moi.
    Bien que cela m'ait été fort profitable, au niveau de mon apprentissage, ça n'a en rien permis de résoudre mon problème.
    Aussi il ne me reste plus qu'à faire appel à vous.
    Et j'espère que " vous saurez être à la hauteur de votre réputation…" (PUB Black Jack)

    Bon, bref.
    Je suis sous Windows XP avec BCB6.
    Je ne suis pas un professionnel, mais un amateur, et un amateur passionné. ( limite cinglé… )

    Problème simple: ( mais réponse semble t-il extrêmement compliquée )
    Je cherche à poser une image PNG avec un fond transparent, sur le bureau et de pouvoir la déplacer.
    Tout le monde connaît les compagnons d'OFFICE ( trombone, médor, robot… ) ?
    Voilà, c'est exactement ça.

    Toutes les réponses à ce type de question que j'ai pu trouver viennent de Delphi, (à croire que la communauté BCB est inexistante..) et/ou me renvoient sous Windows, VC, VB etc…

    Y-a-t-il une possibilité purement BCB ? sans être obligé de faire appel à:
    WS_LAYERED, UpdateLayeredWindow( ) et autres fonctions typiquement Microsoft.
    Je n'ai rien contre MSDN, mais si j'ai choisi BCB, c'est que justement je ne voulais pas apprendre VC++ qui me semblait trop compliqué.

    Bien évidemment, AlphaBlend, AlphaBlendValue, Transparent et TransparentColorValue n'apporte aucune réponse satisfaisante, seul …Brush->Style = clClear est satisfaisant au niveau qualité, mais le fond reste figé…

    La transformation de PNG en BMP " dégueulasse" la qualité de l'image et le rendu n'est pas satisfaisant.

    Quand avec Transparent et TransparentColorValue, la couleur du fond reste sur environ 10 à 20 pixels ( ou peut-être plus ) autour de limage…en épousant son contour.

    ??????

    Je continu à chercher quand même, mais je ne sais vraiment plus ou chercher et je ne voudrais pas être obligé de programmer avec MSDN.

    J'ai lu au passage quelque chose sur la JAPI… fait-elle aussi cela?

    Un dernier point, j'ai beaucoup de mal avec la langue de Shakespeare…

    D'avance merci pour votre aide.

    @++ ( j'espère )

    Claude

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Ce n'est pas spécifiquement VC de faire appel aux fonctions de l'API Win32 (AlphaBlend et consort). Les frameworks MFC, ATL, WTL sont aussi des wrappers, mais il est vrai que la VCL est assez confortable (mon grand regret est l'inacessibilité des méthodes protégées).
    Si tu ne veux pas programmer avec le SDK Il te faut trouver un composant qui fasse ce que tu souhaite (Delphi ou BCB). Il y a 3 solutions: composants Delphi/BCB, programmation API ou librairie (ActiveX ou lib).

    Perso si je devais faire ce que tu veux - et si j'ai bien compris - je passerais par les assistants Office. Il y a une librairie pour animer les assistants et c'est très facile à programmer (tu trouveras du reste des composants pour ça). Le hic est que les assistants utilisent un format interne (il y a un outil pour créer les animations) et que tu ne pourras pas manipuler des PNG directement.

    Voici un composant en Delphi:
    http://www.delphiarea.com/products/assistant/

    yarp
    www.senosoft.com

  3. #3
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut
    @Yarp

    Bonsoir et merci pour ta réponse et tes liens qui malheureusement pour moi, sont ENCORE en anglais...
    (à croire que les Français ne savent rien faire dans ce domaine...)

    En fait, ce n'est pas un problème d'animation, mais un problème de transparence.
    Mon image est fixe et fait partie d'un programme globale.
    Je ne recherche pas non plus du " tout fait ".
    Mon hobby reste avant tout la programmation et j'aurais souhaité pouvoir réaliser mon programme avec le language que je connais le mieux.(l'objectif de ce PRG étant de me permettre d'approfondir justement CE language tout en m'amusant...alors si je passe à un autre !!!! mais bon, si je ne peux pas faire autrement. Il faut quand même bien que je le finisse ce p... . de programme )

    Il est surprenant quand même qu'il n'existe rien dans ce language (Borland)même pas une petite API BCB et que personne utilisant BCB n'ai essayé de faire ce genre de PGR ...

    Etre obligé de faire appel à la concurence ou de transcrire un PGR Delphi, qui lui aussi du reste fait appel à l'API WIN 32...dommage.

    Au fil de mes recherches, j'ai du reste eu l'impression que cette histoire de transparence intéressait beaucoup les Delphistes et pas du tout les Buildertistes ( boff, c'est pas terrible comme nom, mais tout le monde comprendra, enfin je l'espère..)
    Mais alors, pourquoi ???

    Vais-je être OBLIGE de me mettre à l'API WIN32 ???

    A suivre

    Claude

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    > Je ne recherche pas non plus du " tout fait ".
    > Mon hobby reste avant tout la programmation

    Oui, je te comprends. Moi aussi ça me frustre quand je n'ai rien à programmer.

    Si c'est un problème de transparence, il faut que tu explique exactement ce que tu affiche et comment. Un TImage a des fonctions de transparence, un TBitmap n'en as pas.
    Si ton image est dans une TForm (ou autre composant Delphi), j'avais compris sur le bureau, tu la colles dans un TImage qui gère la transparence tout seul.
    Si tu dessine ton Image toi-même, alors gère la transparence toi-même (avec AlphaBlend, certes c'est de l'API mais il faut assumer).
    Tu peux aussi si tu n'aime décidement pas AlphaBlend, créer un bitmap en mémoire et parcourir les pixels (propriété ScanLine) et remplacer les pixels "transparents" par la couleur de la form (clBtnFace), puis Blitter le bitmap sur ton écran (je ne sais pas comment on fait en BCB car j'utilise toujours l'API dans ce cas, mais regarde dans TCanvas, TBimap et/ou TPicture tu trouveras tout ce qu'il te faut). Tu obtiendra ainsi le même résultat qu'avec AlphaBlend, mais est-ce plus simple pour autant ?
    Quand a savoir si c'est en Delphi ou en BCB, ce n'est pas très important puisque BCB bouffe les 2 (c'est un sacré point fort). Bien que comme toi je préfère avoir mon code en C++.

    Enfin en ce qui concerne l'API Win32, je ne vois pas ce qui te bloque. La VCL n'est rien d'autre qu'une surcouche à cette API, elle n'en couvre pas toutes les zones. Au contraire son point fort est d'être très ouverte vers Windows (l'API s'entends) et donc il est parfois plus simple d'appeler les fonctions de dessin de Windows avec la Handle du Bitmap que de s'embêter à tout traduire en VCL (comme le montre le AlphaBlend maison ci-dessus). Question de point de vue, mais dès que je peux je n'hésite pas à appeler le SDK.

    Je m'amuse en ce moment comme un petit fou avec la fonction GradientFill (de l'API). Et je te souhaite autant de plaisir avec ton bitmap.

  5. #5
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut
    Re

    J'ai sur mon bureau un widget météo de chez Yahoo!.
    Je cherche à faire la même chose en C++.
    ( pour moi,encore une fois pour le plaisir et pour progresser en programmation. )

    Après avoir réglé le pb internet et RSS, J'en suis maintenant à l'affichage des nuages et soleil.
    Images PNG excellentes au niveau qualité.
    Le travail se fait avec BCB6 au travers une Form que je rends invisible pour ne laisser sur le bureau que ( pour le moment ) le nuage ou le soleil.

    L'image PNG est "collée" sur un Timage.

    Ce n'est pas que je n'aime pas les Alphamachins et autres, mais c'est que ça ne résoud pas mon pb de transparence.
    Scanline, pixels et autre non plus.
    Pour pouvoir travailler sur une image, ( sauf erreur ) il faut la traduire en BMP ce qui la dégueullasse, cette image PNG à en plus une transparence progressive ce qui donne un effet de 3D...et qui la rend difficile à scanner sans l'abîmer

    Avec AlphaBlend -> c'est toute la Form qui est transparente.(y compris l'image PNG)
    Avec Transparentxxx..-> limage PNG est non utilisable. (Fond transparent mais Zone de la couleur du fond autour de l'image)
    Avec Style->dsClear Image ok, transparence OK, mais fond FIGé...

    Pour solutionner le même pb, Delphi utilise aussi l'API WIN32...que je maîtrise encore moins bien que BCB et je voudrais encore une fois éviter. Si possible.

    Mais bon

    Claude

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    > Pour pouvoir travailler sur une image, ( sauf erreur ) il faut la traduire en
    > BMP ce qui la dégueullasse

    Oui, il faut la traduire en BMP (Windows ne sait afficher que du BMP), mais non ça ne la modifie pas. Cela dépends comment tu la charges, avec quel composant ou librairie (libpng est très très bien mais il faut coder ce n'est pas un composant).

    Donc si je comprends bien tu as la transparence ok mais tu ne parviens pas à bouger ton image tout simplement (c'est ce que je comprends avec Fond figé) ? Rien à voir avec AlphaBlend donc ?

    Pour un fond figé tu peux essayer ça dans le OnMouseDown de la TImage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ::PostMessage(this->Handle, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
    Je n'ai pas CBuilder sur ce poste et pas pu tester, ni vérifier le nom du point dans le MouseDown de CBuilder, le code ci-dessus vient des MFC. Je me rappelle avoir fait un test similaire cette semaine et cela fonctionnait mais étais horriblement sacadé (mais ce n'étais pas tout à fait ça alors essaye tu verras bien).

    Sinon en Delphi:
    http://delphi.about.com/od/windowssh...gnocaption.htm

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    En fait le code ne fonctionnait pas, voici une solution (encore du Delphi, encore de l'english, encore de l'API :
    http://www.delphicorner.f9.co.uk/articles/forms2.htm

    Soit en BCB (toujours dans le MouseDown de ta TImage):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ::ReleaseCapture();
    ::SendMessage(this->handle, WM_SYSCOMMAND, 0xf012, 0);
    Et ça fonctionne nickel (cette fois j'ai testé). Tu peux affiner en testant que le bouton est mbLeft comme dans l'exemple, mais c'est ni-ckel.

    ps En ce qui concerne l'indigence des réponses en BCB par rapport à Delphi il faut tenir compte du fait que Delphi et BCB c'est la même chose. Ensuite la communauté Delphi est très nombreuse alors qu'il y a fort peu de "Builderistes" comme tu dit. Je dirais même que ce forum French est quasi unique (je ne connais pas de forum BCB en anglais et pourtant j'ai cherché), alors forcément l'offre est moins fournie. Mais l'outil est plus puissant que Delphi car il a cette capacité à compiler les librairies Delphi et les librairies C/C++. Et puis le C++ n'est ce pas, c'est ce que nous aimons

  8. #8
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut
    Bonjour

    J'utilise PngComponent pour charger l'image PNG et la travailler.
    C'est une lib spéciale Delphi qui s'insére dans le TImage et fait corps avec la structure BCB.

    Tu me dis que le changement PNG->BMP ne devrait pas modifier mon image...et pourtant!
    Donc je dois certainement mal l'utiliser !!! mais ou ???
    Je me suis pourtant fortement inspiré des exemples Delphi que j'ai pu trouver sur le site...

    J'utilise déja dans le MouseDown:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
    TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    ReleaseCapture();
    Perform(WM_SYSCOMMAND, 0xF012, 0);
    }
    Effectivement c'est Nickel.

    Mon problème viens uniquement de la programmation de la transparence.
    La Form se déplace correctement, mais le fond de la Form reste figé, si j'utilise bsNone pour supprimer les bords et bsClear pour supprimer le fond.
    Ou, la couleur du fond reste autour de mon Image sur environ 10 ou 20 pixels, si j'utilise Transparent Color=true et TransparentColorValue=Couleur du fond.

    J'avais justement l'intention de chercher un autre forum BCB, mais puisque tu as déja cherché...

    BCB serait-il mort ?

    Je fais donc appel au(x) survivant(s) de la communauté...s'il en reste!

    @++

    Claude

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    > Tu me dis que le changement PNG->BMP ne devrait pas modifier

    Nope, je ne dis pas que tu utilise mal ton composant je dis que tu as atteints sans doute les limites de ce que que sais faire ton composant mais que dans l'absolu il n'y aucune perte pour passer de PNG à BMP. Pour charger mes PNG j'utilise libpng (pas un composant), donc il faut coder, chercher dans la doc du composant ou trouver un autre composant.

    Pour ton problème de rafraichissement du fond de la fenêtre, regarde sur ce site:
    http://perso.orange.fr/bardou/michel/index.html
    Recherche "forme" dans la catégorie Windows, il y a 2 cas traités.

  10. #10
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut

    Merci pour ton lien, ce site à l'air EXTRA!!!
    Très très intérressant et semble-t-il complet.
    Tutos, exemples concrets, bonne rubriques, bonne présentation etc..
    Apparemment un bon complément à developpez.com.

    En tout cas, à approfondir... et je vais m'en occuper sous peu -> Dès cet après midi. ( vu le temps !!)

    Je suppose que tu n'as pas le même, directement en BCB. ?

    Je pensais que " PngComponent " était ( malgré son nom ) une librairie et non un composant!

    Qu'entends-tu exactement par composant ?
    Et c'est quoi la différence ?

    Encore pour ton aide.

    @++

    Claude

  11. #11
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Je ne connais pas PngComponent. Je n'utilise des composants que pour l'interface mais pour le reste je fais appel aux librairies natives dès que je peux (libpng pour le PNG).

    Il y a fort peu de composants spécifiquement CBuilder, étant donné que BCB avale le Pascal mais que Delphi lui n'avale pas le C++ les éditeurs de composants ont intérêt à faire des composants en Pascal.
    Mais encore une fois la force de BCB c'est aussi d'accepter des souces non Pascal, non VCL en C ou en C++.

    Un composant c'est une plugin de Delphi/BCB que tu prends à partir de la barre de composants de l'IDE et que tu colles dans ton appli. Ce composant est un objet qui a la particularité d'avoir des propriétés modifiables dans l'inspecteur d'objet, c'est ce qui le rends si attirant pour les débutants car en modificant ces propriétés ont peut faire tout... ce qui a été prévu. Et c'est vrai qu'on gagne beaucoup de temps avec cette technique. Par contre dès que tu te heurte à quelque chose qui n'a pas été prévu la galère commence car tu te rends compte qu'un composant n'est pas ouvert et assez souvent pas évolutif (sauf ceux de la VCL qui sont bien concus).
    Une librairie (un .lib) est un ensemble de fonctions, ça peut aussi être des objets, qui obéi aux principes de la programmation C/C++. Par exemple la libpng a tout un ensemble de fonctions pour charger un PNG mais c'est comme un légo, il faut que tu assemble tout toi-même. C'est donc plus riche qu'un composant mais demande aussi beaucoup plus de temps à coder.

    Autre exemple DirectX et OpenGL s'intégrent sous forme de librairie (bien sur il existe la encore des composants, mais controlera tu le lancement du moteur 3D avec un composant ? pourras-tu choisir quand rafraichir l'affichage ? bref les composants c'est bien mais pas toujours. Le tout est de bien choisir.).

    En général toute l'interface des applis BCB est gérée par des composants, car il est difficile de marier des objets graphiques non Delphi avec la VCL (sauf des ActiveX bien entendu). Mais tout ce qui n'est pas l'interface est libre de choix: Composant, API ou librairie. L'API Win32 n'est rien d'autre qu'un ensemble de librairies.

    Tu peux créer ou compiler des librairies avec BCB. Il faut savoir que BCB n'accepte que des librariries compilées pour BCB. Mais il existe un outil de conversion VS->BCB (oublié le nom), donc pas de panique. Avec un compilateur comme BCB la panoplie est très vaste.

  12. #12
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut
    pour l'info.

    Donc je confirme PngComponent ( malgré son nom ) n'est pas un composant, mais bien une lib avec plusieurs méthodes permettant de travailler les images.

    Je continue à chercher pour mon Pb et reste dans l'attente de la manifestation d'autre(s ?)personne(s ?) intéressées par ce pb... qui sait!

    Je te tiendrai informé de la suite, si suite il y a....

    Encore merci.

    @++

    Claude

Discussions similaires

  1. [SP-2007] Afficher des images avec un fond transparent avec le composant "Summary link webpart"
    Par cloeclodesonoeuf dans le forum SharePoint
    Réponses: 1
    Dernier message: 20/09/2012, 10h35
  2. image png avec fond transparent
    Par tortuegenie dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 08/12/2008, 09h13
  3. Obtenir une image avec un fond transparent
    Par LeXo dans le forum Imagerie
    Réponses: 9
    Dernier message: 28/03/2007, 11h38
  4. [D5] Zoom d'image PNG avec transparence
    Par Thierry Laborde dans le forum Delphi
    Réponses: 9
    Dernier message: 12/06/2006, 15h41
  5. Image GIF a fond transparent dans un formulaire ?
    Par Coquelicot dans le forum IHM
    Réponses: 4
    Dernier message: 25/10/2004, 12h08

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