Problème avec CatchImage et ImageGadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
RegisLG
Messages : 154
Inscription : mer. 22/juin/2005 2:32

Problème avec CatchImage et ImageGadget

Message 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 ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
RegisLG
Messages : 154
Inscription : mer. 22/juin/2005 2:32

Message 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 ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
RegisLG
Messages : 154
Inscription : mer. 22/juin/2005 2:32

Message 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"
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 :)
Répondre