Page 1 sur 1

Problème avec CatchImage et ImageGadget

Publié : lun. 09/janv./2006 16:30
par RegisLG
Bonjour,

est-ce que quelqu'un peut m'expliquer pourquoi lorsque j'intègre une icone a mon executable, et que je la récupère avec CatchImage son affichage est tout pourri alors qu'avec le même fichier icone utilisé par LoadImage ça fonctionne bien.

L'icone que j'utilise est (click droit sur "MonIcone.ico",enregistrer sous).
Le code :

Code : Tout sélectionner

OpenWindow(0,0,0,320,240,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Test affichage icône")
    CreateGadgetList(WindowID())
    
    CatchImage (0,?MonIcone) 
    ImageGadget(0, 10, 10, 48, 48, UseImage(0), #PB_Image_Border)
    SendMessage_(WindowID(0), #WM_SETICON, 1, ImageID())
    
    LoadImage  (1,"C:\MonIcone.ico")
    ImageGadget(1, 80, 10, 128, 128, UseImage(1), #PB_Image_Border)
   ;SendMessage_(WindowID(0), #WM_SETICON, 1, ImageID())

Repeat
  EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow

End
 
MonIcone: IncludeBinary "C:\MonIcone.ico"
Ca donne ça :Image

Question 2 : d'après la doc, quand on met 0 pour les paramètres de taille de l'ImageGadget, le gadget s'ajuste automatiquement à l'image, mais en fait ce comportement se produit même si on met d'autres valeurs, est-ce normal ?

Publié : lun. 09/janv./2006 16:44
par Dr. Dri
LE truc avec les icônes c'est que dans un seul fichier on peut trouver plusieurs exemplaires de la même image dans plusieurs qualités

16*16, 32*32, 48*48
32bits, 16 bits, 256 couleurs, 16 couleurs etc

CatchImage récupère logiquement la première image qu'il trouve. Donc je te propose de réésayer en spécifiant la taille du fichier

Dri ;)

Publié : lun. 09/janv./2006 18:00
par RegisLG
Effectivement, j'ai ouvert l'icone avec microangelo et j'ai viré tous les formats sauf celui qu'il appelle "windows XP" (ça doit etre le format 32 bits) et l'affichage est OK.

Par contre, est-ce un bug de la fonction CatchImage, car la fonction LoadImage charge automatiquement l'icone avec la meilleure résolution ?

As tu une idée sur le problème de l'ajustement automatique "permanent" du ImageGadget ?

Publié : lun. 09/janv./2006 20:41
par Dr. Dri
LoadImage charge un fichier, donc sa totalité, CatchImage charge la premiere image trouvée et ne parcoure pas la totalité du fichier parce que la fonction ne connait pas la taille si tu ne la spécifie pas. Réessaye en donnant la taille du fichier, pour la connaître tu peux faire ceci:

Code : Tout sélectionner

DataSection
  MonIcone:
  IncludeBinary "MonIcone.ico"
  Fin_MonIcone:
EndDataSection

Taille_MonIcone = ?Fin_MonIcone - ?MonIcone
Dri ;)

Publié : mar. 10/janv./2006 0:20
par RegisLG
Euh, je ne vois pas trop ce que tu veux dire par "réessaye en donnant la taille du fichier", car CatchImage prend comme paramètre l'adresse mémoire où est stockée l'image, et non la taille de l'image en question.

Par contre, suite à ta remarque "CatchImage charge la premiere image trouvée", je me suis dit que je pourrai passer l'adresse mémoire + l'OFFSET vers la Nième image stockée dans l'icone.

Malheureusement je n'arrive pas à faire ce que je veux :(
J'ai trouvé une description du format .ICO mais apparement ça colle pas (pour l'image 9 les tailles sont négatives alors que ca marche pour les images précédentes).
Et si je passe l'offset que je trouve j'ai une erreur (adresse invalide).

Voilà ce que j'ai bricolé :

Code : Tout sélectionner

OpenWindow(0,0,0,320,240,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Test affichage icône")
    CreateGadgetList(WindowID())
    StringGadget(10,5,120,310,115,"",#PB_String_MultiLine)
    
    CatchImage (0,?MonIcone) 
    ImageGadget(0, 10, 10, 48, 48, UseImage(0), #PB_Image_Border)
    SendMessage_(WindowID(0), #WM_SETICON, 1, ImageID())
    
    LoadImage  (1,"C:\MonIcone.ico")
    ImageGadget(1, 80, 10, 128, 128, UseImage(1), #PB_Image_Border)
   ;SendMessage_(WindowID(0), #WM_SETICON, 1, ImageID())

    For i=1 To PeekW(?MonIcone+4) ;Nombre max d'images présentes
     pointeur=?MonIcone+6+(i-1)*16 ; Pointeur sur les données+Header+Indice de l'image(la premiere est la 0)
     Info$="IMAGE "+Str(i)+Chr(13)+Chr(10)
     ;
     ; Structure du format ICO : http://www.daubnet.com/formats/ICO.html
     ;
     Info$+"Largeur = "+Str(PeekB(pointeur))+Chr(13)+Chr(10)
     Info$+"Hauteur = "+Str(PeekB(pointeur+1))+Chr(13)+Chr(10)
     Info$+"Couleurs = "+Str(PeekB(pointeur+2))+" (0 signifie 256)"+Chr(13)+Chr(10)
     Info$+"InfoHeader = "+Str(PeekL(pointeur+12))+Chr(13)+Chr(10)
     SetGadgetText(10,Info$)
     
     ;CatchImage (0,PeekL(pointeur+12)) 
     ;ImageGadget(0, 10, 10, 48, 48, UseImage(0), #PB_Image_Border)
     
     Repeat 
     event = WaitWindowEvent() 
   ; Click gauche pour afficher les infos de l'icone suivante
     Until GetAsyncKeyState_(#VK_LBUTTON) & 1 = 1
    Next
    
Repeat
  EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow

End
 
MonIcone: IncludeBinary "C:\MonIcone.ico"

Publié : mar. 10/janv./2006 14:41
par Dr. Dri
J'étais persuadé qu'on pouvait spécifier la taille avec CatchImage :oops:
En fait je confond avec CatchSound()

Donc faudrait le signaler a Fred pour qu'il ajoute la taille en argument facultatif (sinon la solution serait de passer par un fichier temporaire)

Dri

Publié : mar. 07/févr./2006 13:34
par Dr. Dri
Je fais remonter le topic juste pour signaler que dans la version 4 la taille de l'image peut être spécifiée.

Code : Tout sélectionner

CatchImage(#Image, FileName$ [, Length [, Flags]])
Dri :)