Form en alpha avec PNG

Signaler
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
-
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
-
hello
je cherche a faire une form avec canal alpha avec une image .png
avec un morceau de code d'une splashform j'ai obtenu quelquechose de proche mais pas moyen de la modifier correctement.
Les 2 soucis :
- le code va chercher dans le .res l'image au lieu d'une .png
- le code ne permets pas d'ajouter des compos sur la form ...

voici le lien de la page :
http://melander.dk/articles/alphasplash2/2/
et le zip
http://melander.dk/download/AlphaSplashDemo2.zip

Comment faire pour que les composant que je pose sur ma form soit visible ?
Comment faire charger une .png et non pas depuis les ressources ?

Merci pour les infos !

11 réponses

Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
38
Salut,

je sais pas si j'ai bien compris ta demande mais si tu veux charger un fichier png à la place d'une ressource png alors c'est très simple.

Voici un exemple qui modifie la procedure Execute de la version GDI+:
[hr] ...

  Bitmap :=  TBitmap.Create;
  [b]try
     /b //Create and load a GDI+ bitmap from the File

    PNGBitmap : = TGPBitmap.Create('splash.png');
    [b]try
       /b//Convert the PNG to a 32 bit bitmap

      PNGBitmap.GetHBITMAP(MakeColor(0,0,0,0), BitmapHandle);
      // Wrap the bitmap in a VCL TBitmap

      Bitmap.Handle := BitmapHandle;
    [b]finally
      /bPNGBitmap.Free;
     end ;
[i](*
    // Load the PNG from a resource
    Stream : = TResourceStream.Create(HInstance, 'SPLASH', RT_RCDATA);
    try
      // Wrap the VCL stream in a COM IStream
      StreamAdapter := TFixedStreamAdapter.Create(Stream);
      try
        // Create and load a GDI+ bitmap from the stream
        PNGBitmap := TGPBitmap.Create(StreamAdapter);
        try
          // Convert the PNG to a 32 bit bitmap
          PNGBitmap.GetHBITMAP(MakeColor(0,0,0,0), BitmapHandle);
          // Wrap the bitmap in a VCL TBitmap
          Bitmap.Handle := BitmapHandle;
        finally
          PNGBitmap.Free;
        end;
      finally
        StreamAdapter := nil;
      end;
    finally
      Stream.Free;
    end;
*)/i

    ASSERT(Bitmap.PixelFormat = pf32bit, 'Wrong bitmap format - must be 32 bits/pixel');

    // Perform run-time premultiplication

    PremultiplyBitmap(Bitmap);
 ...
[hr]
et ça fonctionne

le reste j'ai pas encore regardé
mais je ne vois pas l'intérêt de passer par une image PNG si c'est pour le convertir en Bitmap ... tu pouvais passer directement par un Bitmap 32bit !!!
[hr]@+Cirec
[hr]
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
38
en ce qui concerne l'ajout de composant sur la fiche
tu peux oublier cette possibilité avec la méthode employée ... en effet, par cette méthode, la fiche est mise en transparence (composant compris) et est utilisée pour afficher progressivement le bitmap mais durant toute cette opération, jusqu'à la fermeture, la fiche reste transparente. Du coup on ne peu pas voir les composants !!!


[hr]@+Cirec
[hr]
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Mince ><
Vers quelle solution partir pour pouvoir utiliser une form en alpha avec un fichier png externe ?
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
38
ben pour juste afficher un fichier image png externe elle fonctionne celle-ci !!
par contre si tu veux des composants en plus ça le fait pas


Mais si le fond de la form est transparent et BorderStyle à bsNone tu devrais pouvoir faire la même chose mais avec des composants visibles

[hr]@+Cirec
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Tu veux dire que si je pose un TImage, que je charge mon PNG qui contient un canal alpha, que je mets la form en "transparent=true" et "bsnone", ma form sera comme je souhaite ?
Si c'est ça, j'ai vraiment cherché loin -_-
je check ça des que possible . merci
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Je viens de tester, deja, ya pas de "transparent=true" sur une form mais "transparentcolor" DONC je dois choisir une couleur et donc ... je me retrouve avec du transparent type GIF au lieu d'un canal alpha type PNG :/
Existe il donc une solution simple pour obtenir une form qui épouse une PNG dont son canal alpha ?
merci
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
J'ai trouvé ça aussi :
http://www.developpez.net/forums/d425012/environnements-developpement/delphi/composants/png-effet-glass-vista-aero/

mais pas moyen d'avoir une form en transparence alpha ...
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Punaise de punaise je ne parviens pas du tout à le faire et je n'arrive pas à croire que personne n'ai une source la dessus sur le net !
Google me trahis cette fois !!!
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Voici un code VB qui le fait !
http://www.vbfrance.com/codes/FORM-GRAPHIQUE-BORDURES-IRREGULIERES-STYLE-WIDGET_36788.aspx

Ca utilise des API windows j'ai cru comprendre, tu connais un peu VB toi ? (ou quelqu'un d'autre ? ^^)
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
38
non non le code VB que tu donnes fait exactement la même chose que le premier code Delphi que tu avais donné en exemple

c'est UpdateLayeredWindow qui veut ça !!

maintenant si tu regarde le commentaire de: neo022 le 15/07/2007 00:49:59
il a trouvé une solution mais c'est du "bricolage" et c'est très lourd !!

même problème ici: voir commentaire de l'auteur.

sinon de mon coté j'ai pu tester (un peu) et j'en arrive aux mêmes conclusions.
néanmoins il reste une dernière possibilité ... c'est encore du "bricolage" mais elle me parait moins alambiquée que celle de neo022.

le principe serait de faire une fausse transparence (faire une copie de l'arrière plan) que l'on dessinera sur le canvas de la fiche, ce qui donnera l'impression de transparence et de dessiner par dessus (avec un canal Alpha) notre image BMP (tirée d'un PNG où non peu importe).
Le résultat final sera le même à ceci prêt que les composants posés sur la fiche resteront visibles et utilisables


[hr]@+Cirec
[hr]
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Merci je vais regarder son code...
Pour l'autre fausse transparence : j'en avais fait une source que j'ai moi même supprimé car je me suis limite faire déchirer ^^