Page 1 sur 1

[Func] GuiCtrlCreatePic avec tous formats d'images

Posté : lun. 01 mars 2010 18:20
par SagePourpre
Voilà une petite fonction tirée de mon udf ( et légèrement modifiée ) qui agit de façon semblable à GuiCtrlCreatePic mais
vous permet d'afficher les formats d'images non supportés par cette dernière (comme les *.png)

$src = chemin du fichier
$x = position X du contrôle
$y = position Y du contrôle
$scale = 1 ratio d'agrandissement ou de réduction de l'image ( un ratio de 1 = dimensions de l'image)
$alt = "texte à afficher lors du survol de l'image"


* Scale n'est pas parfait et si vous changez la grandeur de l'image, il est possible qu'une "ombre" apparaisse sur l'image.
Si vous en connaissez la cause, n'hésitez pas à m'en faire part. Si laissé à 1, il n'y a aucun problème.

Code : Tout sélectionner

#include<gdiplus.au3>

; Func PngGuiCreatePic($src, $x, $y, $scale = 1, $alt = "",$gdi = 1)
Func PngGuiCreatePic($src, $x, $y, $scale = 1, $alt = "")
    Local $gdi_state = $ghGDIPDll
    If $ghGDIPDll = 0 Then _GDIPlus_Startup()
    $hImage2 = _GDIPlus_ImageLoadFromFile($src)
    $ImageHeight = (_GDIPlus_ImageGetHeight($hImage2)) * $scale
    $ImageWidth = (_GDIPlus_ImageGetWidth($hImage2)) * $scale

    If $scale <> 1 Then
        $hBitmap = _WinAPI_CreateBitmap($ImageWidth, $ImageHeight, 1, 32)
        $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
        $hgraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
        _GDIPlus_GraphicsDrawImageRect($hgraphic, $hImage2, 0, 0, $ImageWidth, $ImageHeight)
        $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage1)
        _WinAPI_DeleteObject($hBitmap)
        _GDIPlus_ImageDispose($hImage1)
        _GDIPlus_GraphicsDispose($hgraphic)
    Else
        Local _
                $hBitmap = _GDIPlus_BitmapCreateFromFile($src), _
                $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)


    EndIf

    $pic = GUICtrlCreatePic("", $x, $y, $ImageWidth, $ImageHeight)
    If $alt <> "" Then GUICtrlSetTip($pic, $alt)
    GUICtrlSendMsg($pic, 0x0172, 0, $hBitmap2)
If $gdi_state = 0 Then _GDIPlus_Shutdown()
    Return $pic
EndFunc   ;==>PngGuiCreatePic
 

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : lun. 01 mars 2010 18:32
par Narmeke
Super, à tester ! :lol:

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : jeu. 04 mars 2010 02:05
par SagePourpre
À noter :

Si l'image a de la transparence et que le paramètre $scale <> 1,
la transparence sera remplacée par un fond noir. (À ce moment, il vaut mieux
modifier la taille de l'image à utiliser plutôt que de toucher à ce paramètre.

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : jeu. 04 mars 2010 08:16
par Serge63
Merci et bravo pour cette UDF, c'est exactement ce dont j'avais besoin

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : mer. 14 juil. 2010 12:41
par SagePourpre
14 juillet 2010
Fonction améliorée par l'ajout de la gestion automatique de gdiplus.

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : sam. 04 sept. 2010 06:19
par matwachich
N'est elle pas mieux comme cela! (J'ai mis ; ### juste devant les modifications)

Code : Tout sélectionner

#include-once
#include <GDIPlus.au3>

Func PngGuiCreatePic($src, $x, $y, $w = -1, $h = -1, $alt = "")
    Local $gdi_state = $ghGDIPDll

If $ghGDIPDll = 0 Then _GDIPlus_Startup()

    $hImage2 = _GDIPlus_ImageLoadFromFile($src)

    If $w <> -1 Or $h <> -1 Then
        $ImageHeight = $h ; ###
        $ImageWidth = $w ; ###

        $hBitmap = _WinAPI_CreateBitmap($ImageWidth, $ImageHeight, 1, 32)
        $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
        $hgraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)

        _GDIPlus_GraphicsDrawImageRect($hgraphic, $hImage2, 0, 0, $ImageWidth, $ImageHeight)
        $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage1)

        _WinAPI_DeleteObject($hBitmap)
        _GDIPlus_ImageDispose($hImage1)
        _GDIPlus_GraphicsDispose($hgraphic)
    Else
        $ImageHeight = _GDIPlus_ImageGetHeight($hImage2) ; ###
        $ImageWidth = _GDIPlus_ImageGetWidth($hImage2) ; ###

        Local $hBitmap, $hBitmap2
        $hBitmap = _GDIPlus_BitmapCreateFromFile($src)
        $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
    EndIf

    $pic = GUICtrlCreatePic("", $x, $y, $ImageWidth, $ImageHeight)
    If $alt <> "" Then GUICtrlSetTip($pic, $alt)
    GUICtrlSendMsg($pic, 0x0172, 0, $hBitmap2)

If $gdi_state = 0 Then _GDIPlus_Shutdown()

    Return $pic
EndFunc   ;==>PngGuiCreatePic
Comment gérer la transparence si on donne une taille différente à l'image!???

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : sam. 04 sept. 2010 15:32
par pierrotm777
Ca fonctionne , mais je me retrouve avec un fond noir .

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : dim. 05 sept. 2010 18:30
par matwachich
Tu as un fond noir quand tu redimensionne l'image, pour ne pas faire cela, tu mets $w et $h à -1 (par défaut), c'est équivalent à un $scale à 1

J'ai changer la méthode du scale pour la taille directement car je pense que c'est plus pratique pour bien faire coller précisement une image dans un GUI.

Je cherche toujours pour la transparence, si quelqu'un à une réponse...

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : dim. 05 sept. 2010 19:09
par pierrotm777
C'est parfait pour moi , j'ai juste reduit mes images à la taille que je souhaitais ce qui me permet de conserver w=-1 et h=-1.

Comment faire pour cacher l'image afficher , avec une image vide ?

Avec cette ligne:
$Pic = PngGuiCreatePic(@ScriptDir&"\pictures\30.png", 560, 0, -1, -1, $alt = "IMAGE")

Je ne vois aucun tooltip s'afficher!

Merci pour cette fonction trés sympa !

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : mar. 07 sept. 2010 18:17
par pierrotm777
Serait il possible de modifier cette fonction afin de pouvoir afficher une image avec une rotation de 0 à 359° ?

Merci

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : mer. 08 sept. 2010 01:34
par SagePourpre
@matwachich

J'avais pensé à le faire comme ça en premier mais j'ai choisi "scale" afin de pouvoir modifier la taille de l'image
facilement sans perdre les proportions (et sans avoir à faire les calculs manuellement).

Ceci dit, utiliser $w et $h au lieu de $scale est une alternative tout à fait valable.


@Pierrotm777


Tu as mis $alt="IMAGE" essaie avec seulement "IMAGE" et ça devrait fonctionner.

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : mer. 08 sept. 2010 01:41
par matwachich
Ok j'attend!
Et si t'as un truc pour la transparence...

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : mer. 08 sept. 2010 02:23
par SagePourpre
Je vais voir ce que je peux faire.

J'ai bien une idée pour la transparence.

Un autre de mes projets (duquel cette fonction a été créée) permet d'ajuster la
transparence d'une image servant de GUI.

Cependant, l'UDF n'étant plus à jour et comportant quelques failles toujours non-réglées...
J'essaierai de voir si je peux arriver à un résultat satisfaisant dès que j'aurai le temps.


Pour faire une rotation, le moyen le plus simple serait la mise en application de _GDIPlus_MatrixRotate().
Mes études ne me laisse pas vraiment de temps pour autoit de ces jours-ci mais si je parviens à un résultat,
je le publierai ici.

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

Posté : dim. 03 oct. 2010 02:45
par Percival
Bonjour, cela fait 4 jours que j'essaye d'ajouter la fonction _GDIPlus_MatrixRotate() mais sans succès, à chaque fois, soit l'image ne s'affiche pas ou un rectangle noir s'affiche. J'utilise une version "lite" car plus simple a modifier. voici le code que j'utilise actuellement.

Code : Tout sélectionner

Func PngGuiCreatePic($src, $x, $y, $nAngle = 90)    
    $nAngle = 90
  
  $nW = 14
  $nH = 18
  
  _GDIPlus_Startup()
    $hImage1 = _GDIPlus_ImageLoadFromFile($src)
    $hGraphic1 = _GDIPlus_ImageGetGraphicsContext($hImage1)
    $hImage2 = _GDIPlus_BitmapCreateFromGraphics($nW,$nH,$hGraphic1)
    $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hImage2)

    $matrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixRotate($matrix, 90)
    _GDIPlus_GraphicsSetTransform($hGraphic2, $matrix)
    _GDIPlus_GraphicsDrawImage($hGraphic2, $hImage1, 0, -$nW)

    $pic = GUICtrlCreatePic("", ($x - ($nW / 2)), ($y - ($nH / 2)), $nW, $nH)
    
    Local _
        $hBitmap = _GDIPlus_BitmapCreateFromGraphics($nW, $nH, $hGraphic2)
        $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    
    _WinAPI_DeleteObject(GUICtrlSendMsg($pic, 0x0172, 0, $hBitmap2))

    _GDIPlus_MatrixDispose($matrix)
    _GDIPlus_GraphicsDispose($hGraphic1)
    _GDIPlus_GraphicsDispose($hGraphic2)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
  
    _GDIPlus_Shutdown()
    Return $pic
EndFunc   ;==>PngGuiCreatePic