Un sélecteur d'icône (Permet de choisir une icône)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Un sélecteur d'icône (Permet de choisir une icône)

Message par Le Soldat Inconnu »

Coucou,

Voilà la fonction finale qui résulte de mes derniers posts sur le forum

il s'agit d'un sélecteur d'icône, un peut dans le même style que quand on veut changer l'icône d'un raccourci.
Mais en un peu plus poussé puisqu'il permet de choisir l'icône du fichier ou l'icône contenue dans le fichier (comme une dll ou un exe)

format d'icône supporté : Tous
16*16
32*32
48*48
128*128
256*256
Avec tous les formats de couleurs

donc ça donne ce gros truc.

J'ai besoin de testeur pour Windows 2000 voir 98 puisque ça doit normalement marcher sous ces OS, merci.

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Récupérer une icône de la taille 16*16, 32*32, 48*48

Procedure.s GetSpecialFolderLocation(Valeur.L) ; Récupère l'adresse d'un dossier spécifique de Windows
  Protected SpecialFolderLocation.s, Dossier_ID.L
  If SHGetSpecialFolderLocation_(0, Valeur, @Dossier_ID) = 0
    SpecialFolderLocation = Space(255)
    SHGetPathFromIDList_(Dossier_ID, @SpecialFolderLocation)
    If SpecialFolderLocation
      If Right(SpecialFolderLocation, 1) <> "\"
        SpecialFolderLocation + "\"
      EndIf
    EndIf
  EndIf
  ProcedureReturn SpecialFolderLocation
EndProcedure

#SHIL_SMALL = $1
#SHIL_LARGE = $0
#SHIL_EXTRALARGE = $2
#SHIL_JUMBO = $4

#LOAD_LIBRARY_AS_DATAFILE = 2

DataSection
  IID_IImageList:
  Data.L $46EB5926
  Data.w $582E,$4017
  Data.b $9F,$DF,$E8,$99,$8D,$AA,$09,$50
EndDataSection 
Structure IMAGELISTDRAWPARAMS
  cbSize.L
  himl.L
  i.L
  hdcDst.L
  x.L
  y.L
  cx.L
  cy.L
  xBitmap.L
  yBitmap.L
  rgbBk.L
  rgbFg.L
  fStyle.L
  dwRop.L
  fState.L
  frame.L
  crEffect.L
EndStructure
Interface IImageList2 Extends iUnknown
  Add(hbmImage, hbmMask, pi)
  ReplaceIcon(i, hIcon, pi)
  SetOverlayImage(iImage, iOverlay)
  Replace(i, hbmImage, hbmMask)
  AddMasked(hbmImage, crMask, pi)
  Draw(pimldp.IMAGELISTDRAWPARAMS)
  Remove(i)
  GetIcon(i, flags, picon)
  GetImageInfo(i, pImageInfo.IMAGEINFO)
  Copy(iDst, punkSrc.IImageList, iSrc, uFlags)
  Merge(i1, punk2.IImageList, i2, dx, dy, riid, ppv)
  Clone(riid, ppv)
  GetImageRect(i, prc.RECT)
  GetIconSize(cx, cy)
  SetIconSize(cx, cy)
  GetImageCount(pi)
  SetImageCount(uNewCount)
  SetBkColor(clrBk, pclr)
  GetBkColor(pclr)
  BeginDrag(iTrack, dxHotspot, dyHotspot)
  EndDrag()
  DragEnter(hwndLock, x, y)
  DragLeave(hwndLock)
  DragMove(x, y)
  SetDragCursorImage(punk.IImageList, iDrag, dxHotspot, dyHotspot)
  DragShowNolock(fShow)
  GetDragImage(ppt.POINT, pptHotspot.POINT, riid, ppv)
  GetItemFlags(i, dwFlags)
  GetOverlayImage(iOverlay, piIndex)
EndInterface


Global OS = OSVersion()
ProcedureDLL.l GetIconFile(IconFile.s, Size.l) ; Get icon 16*16, 32*32 or 48*48
  Protected hIcon.l, FileInfo.SHFILEINFO, dll_Shell32.l, hResult.l, *Guid.l
  Select Size
    Case #SHIL_SMALL, 16
      SHIL = #SHIL_SMALL
    Case #SHIL_LARGE, 32
      SHIL = #SHIL_LARGE
    Case #SHIL_EXTRALARGE, 48
      SHIL = #SHIL_EXTRALARGE
    Case #SHIL_JUMBO, 128, 256
      If OS >= #PB_OS_Windows_Vista
        SHIL = #SHIL_JUMBO
      Else
        SHIL = #SHIL_EXTRALARGE
      EndIf
    Default
      SHIL = #SHIL_SMALL
  EndSelect
  If OS >= #PB_OS_Windows_XP ; Pour Windows XP et plus, toute taille d'icône
    dll_Shell32 = OpenLibrary(#PB_Any, "Shell32.dll")
    If dll_Shell32
      *Guid = ?IID_IImageList
      SHGetFileInfo_(IconFile, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX)
      hResult = CallFunction(dll_Shell32, "SHGetImageList", SHIL, *Guid, @ImageList.IImageList2)
      If hResult = 0
        ImageList\GetIcon(FileInfo\iIcon, #ILD_TRANSPARENT, @hIcon)
        ImageList\Release()
      EndIf
      CloseLibrary(dll_Shell32)
    EndIf
  Else ; Avant windows XP, icône 16*16 ou 32*32
    If SHIL = #SHIL_EXTRALARGE Or SHIL = #SHIL_LARGE
      SHGetFileInfo_(IconFile, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_LARGEICON)
      hIcon = InfosFile\hIcon
    Else
      SHGetFileInfo_(IconFile, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
      hIcon = InfosFile\hIcon
    EndIf
  EndIf
  ProcedureReturn hIcon
EndProcedure
ProcedureDLL.l GetSmallIconFile(IconFile.s) ; Get icon 16*16
  ; Cette procedure permet d'extraire l'ID de l'icône 16*16 associée au type de fichier ou au dossier dont l'adresse est IconFile
  ProcedureReturn GetIconFile(IconFile.s, 16)
EndProcedure
ProcedureDLL.l GetLargeIconFile(IconFile.s) ; Get icon 32*32
  ; Cette procedure permet d'extraire l'ID de l'icône 32*32 associée au type de fichier ou au dossier dont l'adresse est IconFile
  ProcedureReturn GetIconFile(IconFile.s, 32)
EndProcedure
ProcedureDLL.l GetExtraLargeIconFile(IconFile.s) ; Get icon 48*48
  ; Cette procedure permet d'extraire l'ID de l'icône 48*48 associée au type de fichier ou au dossier dont l'adresse est IconFile
  ProcedureReturn GetIconFile(IconFile.s, 48)
EndProcedure
ProcedureDLL.l GetJumboIconFile(IconFile.s) ; Get icon 128*128 or 256*256
  ; Cette procedure permet d'extraire l'ID de l'icône 128*128 ou 256*256 associée au type de fichier ou au dossier dont l'adresse est IconFile
  ProcedureReturn GetIconFile(IconFile.s, 128)
EndProcedure

Procedure GetIconIndexList_Enumerate(hLibrary, lpszType, lpszName, *Memory.Long)
  Protected Result.l, Name.s
  *Memory\l = ReAllocateMemory(*Memory\l, MemorySize(*Memory\l) + 4)
  If *Memory\l
    If lpszName >> 16
      Name = PeekS(lpszName) 
      lpszName = AllocateMemory(StringByteLength(Name + "0"))
      Debug Name
      PokeS(lpszName, Name)
    EndIf
    Debug lpszName
    PokeL(*Memory\l + MemorySize(*Memory\l) - 8, lpszName)
    Result = #True
  Else
    Result = #False
  EndIf 
  ProcedureReturn Result
EndProcedure
ProcedureDLL.l GetIconIndexList(IconFile.s) ; Get icon index list
  Protected hLibrary, Memory.l
  hLibrary = LoadLibraryEx_(IconFile, #NULL, #LOAD_LIBRARY_AS_DATAFILE)
  If hLibrary <> #NULL
    *Memory = AllocateMemory(4)
    If *Memory
      EnumResourceNames_(hLibrary, #RT_GROUP_ICON, @GetIconIndexList_Enumerate(), @*Memory)
    EndIf
    FreeLibrary_(hLibrary)
  EndIf
  ProcedureReturn *Memory
EndProcedure
ProcedureDLL FreeIconIndexList(Memory.l) ; Free icon index list
  Protected Index.l, Value.l
  Index = 0
  Repeat
    Value = PeekL(Memory + Index * 4) ; Numéro de l'icône
    If Value > 0
      If Value >> 16
        FreeMemory(Value)
      EndIf
      Index + 1
    EndIf
  Until Value = 0
  FreeMemory(Memory)
EndProcedure
ProcedureDLL ExtractIconFile(IconFile.s, IconIndex.l, Size.l) ; Extract icon from library or exe
  Protected hLibrary, hIcon.l
  If IconIndex > 0
    hLibrary = LoadLibraryEx_(IconFile, #NULL, #LOAD_LIBRARY_AS_DATAFILE)
    If hLibrary <> #NULL
      If IconIndex >> 16
        hIcon = LoadImage_(hLibrary, PeekS(IconIndex), #IMAGE_ICON, Size, Size, 0)
      Else
        hIcon = LoadImage_(hLibrary, IconIndex & $FFFF, #IMAGE_ICON, Size, Size, 0)
      EndIf
      FreeLibrary_(hLibrary)
    EndIf
  Else
    hIcon = GetIconFile(IconFile, Size)
  EndIf
  ProcedureReturn hIcon
EndProcedure
ProcedureDLL ExtractSmallIconFile(IconFile.s, IconIndex.l) ; Extract icon 16*16 from library or exe
  ProcedureReturn ExtractIconFile(IconFile.s, IconIndex.l, 16)
EndProcedure
ProcedureDLL ExtractLargeIconFile(IconFile.s, IconIndex.l) ; Extract icon 32*32 from library or exe
  ProcedureReturn ExtractIconFile(IconFile.s, IconIndex.l, 32)
EndProcedure
ProcedureDLL ExtractExtraLargeIconFile(IconFile.s, IconIndex.l) ; Extract icon 48*48 from library or exe
  ProcedureReturn ExtractIconFile(IconFile.s, IconIndex.l, 48)
EndProcedure


Structure IconFileRequester_IconInfo
  File.s
  Index.L
EndStructure
Procedure IconFileRequester(*Icon.IconFileRequester_IconInfo, WindowParentID.L = -1)
  Protected IconFileRequester_Window, IconFileRequester_Quit, IconFileRequester_Select, IconFileRequester_Index, IconFileRequester_File.s, IconFileRequester_NewFile.s
  Protected IconFileRequester_List, IconFileRequester_16, IconFileRequester_32, IconFileRequester_48, IconFileRequester_OpenFile, IconFileRequester_OpenDirectory, IconFileRequester_OK, IconFileRequester_String
  Protected NewList IconFileRequester_Icon()
  Protected IconFileRequester_Icon16, IconFileRequester_Icon32, IconFileRequester_Icon48, IconFileRequester_SearchIndex, IconFileRequester_SearchIcon, *IconFileRequester_ListIcon, IconFileRequester_ListIndex
  #IconFileRequester_X = 480
  #IconFileRequester_Y = 300
  #IconFileRequester_B = 4
  #IconFileRequester_Button = 75
  #IconFileRequester_StringY = 23
  IconFileRequester_File = *Icon\File
  If IconFileRequester_File = ""
    IconFileRequester_File = GetSpecialFolderLocation(41) + "shell32.dll"
  EndIf
  IconFileRequester_Index = *Icon\Index
  IconFileRequester_16 = #PB_Any
  If IsWindow(WindowParentID)
    ; On désactive la fenêtre mère
    DisableWindow(WindowParentID, 1)
    IconFileRequester_Window = OpenWindow(#PB_Any, 0, 0, #IconFileRequester_X, #IconFileRequester_Y, "Sélection d'une icône", #PB_Window_WindowCentered | #PB_Window_SystemMenu | #PB_Window_Invisible, WindowParentID)
  Else
    IconFileRequester_Window = OpenWindow(#PB_Any, 0, 0, #IconFileRequester_X, #IconFileRequester_Y, "Sélection d'une icône", #PB_Window_SystemMenu | #PB_Window_Invisible)
  EndIf
  IconFileRequester_Select = 0
  If IconFileRequester_Window
    ; Création des gadgets
    IconFileRequester_List = ListIconGadget(#PB_Any, #IconFileRequester_B, #IconFileRequester_B + #IconFileRequester_StringY, #IconFileRequester_X - 3 * #IconFileRequester_B - #IconFileRequester_Button, #IconFileRequester_Y - 3 * #IconFileRequester_B - #IconFileRequester_Button - #IconFileRequester_StringY, "Icône", 100, #PB_ListIcon_AlwaysShowSelection)
    SetGadgetAttribute(IconFileRequester_List, #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon)
    IconFileRequester_String = StringGadget(#PB_Any, #IconFileRequester_B, #IconFileRequester_B, #IconFileRequester_X - 3 * #IconFileRequester_B - #IconFileRequester_Button, #IconFileRequester_StringY, IconFileRequester_File)
    Frame3DGadget(#PB_Any, #IconFileRequester_B, #IconFileRequester_Y - #IconFileRequester_B - #IconFileRequester_Button, #IconFileRequester_X - 3 * #IconFileRequester_B - #IconFileRequester_Button, #IconFileRequester_Button, "Prévisualisation")
    IconFileRequester_OpenFile = ButtonGadget(#PB_Any, #IconFileRequester_X - #IconFileRequester_B - #IconFileRequester_Button, #IconFileRequester_B, #IconFileRequester_Button, #IconFileRequester_Button, "Icône d'un fichier", #PB_Button_MultiLine)
    IconFileRequester_OpenDirectory = ButtonGadget(#PB_Any, #IconFileRequester_X - #IconFileRequester_B - #IconFileRequester_Button, #IconFileRequester_B + #IconFileRequester_Button, #IconFileRequester_Button, #IconFileRequester_Button, "Icône d'un dossier", #PB_Button_MultiLine)
    IconFileRequester_OK = ButtonGadget(#PB_Any, #IconFileRequester_X - #IconFileRequester_B - #IconFileRequester_Button, #IconFileRequester_Y - #IconFileRequester_B - #IconFileRequester_Button, #IconFileRequester_Button, #IconFileRequester_Button, "Valider", #PB_Button_MultiLine | #PB_Button_Default)
    HideWindow(IconFileRequester_Window, 0)
    ; On force l'actualisation de l'affichage
    IconFileRequester_Action = 1
    ; Boucle
    Repeat
      ; Actions à faire
      Repeat
        Select IconFileRequester_Action
          Case 1 ; Mise à jour de la liste des icônes
            ; On vide le ListIconGadget
            ClearGadgetItems(IconFileRequester_List)
            ; On supprime les anciennes icones
            ForEach IconFileRequester_Icon()
              DestroyIcon_(IconFileRequester_Icon())
            Next
            ClearList(IconFileRequester_Icon())
            ; On reremplie la liste
            ; Icône du fichier
            IconFileRequester_ListIndex = 0
            IconFileRequester_SearchIcon = GetIconFile(IconFileRequester_File, 32)
            AddGadgetItem(IconFileRequester_List, 0, "Icône du fichier", IconFileRequester_SearchIcon)
            SetGadgetState(IconFileRequester_List, 0)
            SetGadgetItemData(IconFileRequester_List, IconFileRequester_ListIndex, 0)
            ; Icônes contenu dans le fichier
            *IconFileRequester_ListIcon = GetIconIndexList(IconFileRequester_File) ; On liste tous les icônes
            If *IconFileRequester_ListIcon
              Repeat
                IconFileRequester_SearchIndex = PeekL(*IconFileRequester_ListIcon + IconFileRequester_ListIndex * 4) ; Numéro de l'icône
                IconFileRequester_ListIndex + 1
                If IconFileRequester_SearchIndex > 0
                  IconFileRequester_SearchIcon = ExtractIconFile(IconFileRequester_File, IconFileRequester_SearchIndex, 32) ; Extraction de l'icône
                  If IconFileRequester_SearchIcon > 0
                    ; Affichage de l'icône
                    AddElement(IconFileRequester_Icon())
                    IconFileRequester_Icon() = IconFileRequester_SearchIcon
                    If IconFileRequester_SearchIndex >> 16 = 0
                      AddGadgetItem(IconFileRequester_List, IconFileRequester_ListIndex, "Icône inclue " + Str(IconFileRequester_SearchIndex), IconFileRequester_SearchIcon)
                    Else
                      AddGadgetItem(IconFileRequester_List, IconFileRequester_ListIndex, "Icône inclue " + PeekS(IconFileRequester_SearchIndex), IconFileRequester_SearchIcon)
                    EndIf
                    SetGadgetItemData(IconFileRequester_List, IconFileRequester_ListIndex, IconFileRequester_SearchIndex)
                    If IconFileRequester_SearchIndex = IconFileRequester_Index ; Si c'est licône par défaut, on le sélectionne
                      SetGadgetState(IconFileRequester_List, IconFileRequester_ListIndex)
                    EndIf
                  EndIf
                EndIf
              Until IconFileRequester_SearchIndex = 0
              FreeIconIndexList(*IconFileRequester_ListIcon)
            EndIf
            ; On actualise l'aperçu
            IconFileRequester_Action = 2
          Case 2 ; Mise à jour des aperçus
            ; On supprime les anciennes icônes
            If IconFileRequester_Icon16
              DestroyIcon_(IconFileRequester_Icon16)
              IconFileRequester_Icon16 = 0
            EndIf
            If IconFileRequester_Icon32
              DestroyIcon_(IconFileRequester_Icon32)
              IconFileRequester_Icon32 = 0
            EndIf
            If IconFileRequester_Icon48
              DestroyIcon_(IconFileRequester_Icon48)
              IconFileRequester_Icon48 = 0
            EndIf
            ; On charge les nouvelles icones
            IconFileRequester_Icon16 = ExtractIconFile(IconFileRequester_File, IconFileRequester_Index, 16)
            IconFileRequester_Icon32 = ExtractIconFile(IconFileRequester_File, IconFileRequester_Index, 32)
            IconFileRequester_Icon48 = ExtractIconFile(IconFileRequester_File, IconFileRequester_Index, 48)
            If IsGadget(IconFileRequester_16)
              ; On actualise les images des gadgets
              If IconFileRequester_Icon16 > 0
                SetGadgetState(IconFileRequester_16, IconFileRequester_Icon16)
              Else
                FreeGadget(IconFileRequester_16)
              EndIf
              If IconFileRequester_Icon32 > 0
                SetGadgetState(IconFileRequester_32, IconFileRequester_Icon32)
              Else
                FreeGadget(IconFileRequester_32)
              EndIf
              If IconFileRequester_Icon48 > 0
                SetGadgetState(IconFileRequester_48, IconFileRequester_Icon48)
              Else
                FreeGadget(IconFileRequester_48)
              EndIf
            Else
              ; On crée les gadgets
              If IconFileRequester_Icon16 > 0
                IconFileRequester_16 = ImageGadget(#PB_Any, #IconFileRequester_B + 24, #IconFileRequester_Y - #IconFileRequester_B - #IconFileRequester_Button + 24, 16, 16, IconFileRequester_Icon16)
              EndIf
              If IconFileRequester_Icon32 > 0
                IconFileRequester_32 = ImageGadget(#PB_Any, #IconFileRequester_B * 2 + 24 + 16, #IconFileRequester_Y - #IconFileRequester_B - #IconFileRequester_Button + 24, 32, 32, IconFileRequester_Icon32)
              EndIf
              If IconFileRequester_Icon48 > 0
                IconFileRequester_48 = ImageGadget(#PB_Any, #IconFileRequester_B * 3 + 24 + 16 + 32, #IconFileRequester_Y - #IconFileRequester_B - #IconFileRequester_Button + 24, 48, 48, IconFileRequester_Icon48)
              EndIf
            EndIf
            IconFileRequester_Action = 0
          Case 3 ; Mise à jour du StringGadget
            SetGadgetText(IconFileRequester_String, IconFileRequester_File)
            IconFileRequester_Action = 1
        EndSelect
      Until IconFileRequester_Action = 0
      ; Boucle d'évènements
      IconFileRequester_Event = WaitWindowEvent()
      If EventWindow() = IconFileRequester_Window
        Select IconFileRequester_Event
          Case #PB_Event_Gadget
            Select EventGadget()
              Case IconFileRequester_OpenFile
                IconFileRequester_NewFile = OpenFileRequester("Ouvrir", IconFileRequester_File, "Tous les fichiers|*.*", 0)
                If IconFileRequester_NewFile
                  IconFileRequester_File = IconFileRequester_NewFile
                  IconFileRequester_Index = 0
                  IconFileRequester_Action = 3
                EndIf
              Case IconFileRequester_OpenDirectory
                IconFileRequester_NewFile = PathRequester("Ouvrir", GetPathPart(IconFileRequester_File))
                If IconFileRequester_NewFile
                  IconFileRequester_File = IconFileRequester_NewFile
                  IconFileRequester_Index = 0
                  IconFileRequester_Action = 3
                EndIf
              Case IconFileRequester_List
                If GetGadgetState(IconFileRequester_List) >= 0
                  IconFileRequester_Index = GetGadgetItemData(IconFileRequester_List, GetGadgetState(IconFileRequester_List))
                  IconFileRequester_Action = 2
                Else
                  For IconFileRequester_ListIndex = 0 To CountGadgetItems(IconFileRequester_List) - 1
                    If IconFileRequester_Index = GetGadgetItemData(IconFileRequester_List, IconFileRequester_ListIndex)
                      SetGadgetState(IconFileRequester_List, IconFileRequester_ListIndex)
                    EndIf
                  Next
                EndIf
              Case IconFileRequester_String
                If EventType() = #PB_EventType_Change
                  If FileSize(GetGadgetText(IconFileRequester_String)) <> -1
                    IconFileRequester_File = GetGadgetText(IconFileRequester_String)
                    IconFileRequester_Index = 0
                    IconFileRequester_Action = 1
                  EndIf
                EndIf
              Case IconFileRequester_OK
                ; On envoie les nouvelles valeurs en résultat
                *Icon\File = IconFileRequester_File
                *Icon\Index = IconFileRequester_Index
                IconFileRequester_Select = 1
                IconFileRequester_Quit = 1
            EndSelect
          Case #PB_Event_CloseWindow
            IconFileRequester_Quit = 1
        EndSelect
      EndIf
    Until IconFileRequester_Quit
    CloseWindow(IconFileRequester_Window)
    ; On supprime les icones ouvertes
    ForEach IconFileRequester_Icon()
      DestroyIcon_(IconFileRequester_Icon())
    Next
    If IconFileRequester_Icon16
      DestroyIcon_(IconFileRequester_Icon16)
    EndIf
    If IconFileRequester_Icon32
      DestroyIcon_(IconFileRequester_Icon32)
    EndIf
    If IconFileRequester_Icon48
      DestroyIcon_(IconFileRequester_Icon48)
    EndIf
  EndIf
  If IsWindow(WindowParentID)
    ; On réactive la fenêtre mère
    DisableWindow(WindowParentID, 0)
    SetActiveWindow(WindowParentID)
  EndIf
  ProcedureReturn IconFileRequester_Select
EndProcedure



; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 500, 500, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

Icone.IconFileRequester_IconInfo
Icone\File = GetSpecialFolderLocation(41) + "shell32.dll"
Icone\Index = -1
hIcone = ExtractIconFile(Icone\File, Icone\Index, 48)
ButtonImageGadget(0, 50, 50, 100, 100, hIcone)

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          If IconFileRequester(@Icone, 0)
            VielleIcone = hIcone
            hIcone = ExtractIconFile(Icone\File, Icone\Index, 48)
            If VielleIcone
              DestroyIcon_(VielleIcone)
            EndIf
            SetGadgetAttribute(0, #PB_Button_Image, hIcone)
          EndIf
      EndSelect
  EndSelect
  
Until Event = #PB_Event_CloseWindow

If hIcone
  DestroyIcon_(hIcone)
EndIf
Dernière modification par Le Soldat Inconnu le ven. 22/mai/2009 10:45, modifié 4 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Un sélecteur d'icône (Permet de choisir une icône)

Message par gnozal »

Le Soldat Inconnu a écrit :J'ai besoin de testeur pour Windows 2000 voir 98 puisque ça doit normalement marcher sous ces OS, merci.
Pour info, çà fonctionne sous NT4.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Joli! Devrait être très utile.
Je viens de tester (Win Vista 32 bits) et j'ai un Invalid Memory Access lorsque je veux valider une icône. Point d'arrêt dans la Procedure IconFileRequester(*IconFile.L, *Index.L, WindowParentID.L = -1) au niveau de la ligne ProcedureReturn IconFileRequester_Select et donc plantage.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

alors ça, j'ai eu plein de merde de ce genre en passant sous PB4.3
essaie de supprimer tes userlibs pour voir si ça plante toujours. Merci

Je ferais un saut pour tester sur Vista ce soir
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

comprends pas , j'ai une syntaxe error en ligne 85
sur :

Code : Tout sélectionner


Macro HIWORD(Value)
	(Value>>16)
EndMacro
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Dobro a écrit :comprends pas , j'ai une syntaxe error en ligne 85
sur :

Code : Tout sélectionner


Macro HIWORD(Value)
	(Value>>16)
EndMacro
hum !! reglé !! j'ai changé par
LOWORD2
et
HIWORD2

surement un conflit avec une lib !! :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Correction du code, j'avais fait une erreur sur un reallocatememory.

Jacobus, ça plante toujours ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Non, c'est tout bon! :D
A rectifier sur le forum en où Netmaestro avait eu le même IMA...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Pour Infos,

je viens de rencontrer un problème avec plusieurs exe (pas ton code, le mien).

Dans l'application que je développe, dans la callback d'énumération, je récupère tous les identifiants des groupes d'icônes dans une variable chaine, chaque identifiant étant séparé du suivant par chr(3).

Ensuite, après avoir terminé l'énumération, j'utilisais les identifiants stockés dans la chaine dans une autre procédure.

Sur des fichiers dont l'identifiant est une chaine (il y en a quelques uns), Findresource_() échoue et l'erreur windows (1814) est ERROR_RESOURCE_NAME_NOT_FOUND.

Par contre, si j'utilise Findresource_() directement dans la callback, l'APi n'échoue pas. Peut-être un problème de segment.

J'avais utilisée une chaine car au début je voulais utiliser une liste chainée (simple, rapide, efficace) mais là aussi, l'accès aux éléments de cette liste chainée ne fonctionnait pas dans la callback :!:
Je ne considère pas ça comme un bug, peut-être à tort.

C'est juste pour te dire qu'il faut accèder à la mémoire des icônes dans la callback d'énumération. Je n'ai des erreurs qu'avec des identifiants chaine.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Est-ce que tu peux me filer ton exe qui plante ou essayer avec mon code, stp. Car j'avoue avoir un peu de mal à te suivre, hormis que la gestion des identifiants par string semble erronée.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Voilà 2 exe avec identifiant alphanumérique

cpviewer.exe

isignup.exe

Le premier fichier comporte un groupe d'icône avec l'identifiant chaine "IDI_APPICON" et 5 icônes.

Le second fichier comporte un groupe d'icône avec l'identifiant chaine "ICO_APP" et 2 icônes.

Image

Image
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Merci pour les Exe :)

J'ai fais les modifications de mon code plus haut et ça marche aussi avec des icônes en ressource ayant un string comme nom
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
charvista
Messages : 5
Inscription : dim. 13/déc./2009 14:05

Re: Un sélecteur d'icône (Permet de choisir une icône)

Message par charvista »

Merci infiniment mon cher Soldat Inconnu pour ton code, j'avais besoin d'un code qui pouvait extraire une des icônes inclues dans un fichier .ico.
Il me reste maintenant à inclure le code nécessaire dans mon application.
Je vais même tenter d'adapter ton code pour qu'il puisse afficher les autres formats que 16*16, 32*32 et 48*48. J'espère réussir :wink:
Répondre