ComboBoxGadget personnalisé avec icône

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

ComboBoxGadget personnalisé avec icône

Message par Octavius »

Voici un petitcode, résultat de mes prises de tête sur les forums anglais et français pour réussir à mettre au un menu déroulant avec des images. En bonus, une petite procédure qui permet de régler la taille du menu déroulé.

Les images que j'utilise dans cette exemple peuvent être téléchargées ici : http://keonet.free.fr/Images_BMP32.zip

Code : Tout sélectionner

;ComboBox personnalisée, par Octavius
;Création d'une icône transparente pour chaque item à partir d'une image 32 bits (PNG ou BMP 32 bits)
;Possibilité de régler la hauteur du menu déroulant

EnableExplicit

#MyCombo=0
#White=$FFFFFF
#ItemHeight=16 ;Par défaut la hauteur PB est 14 mais ici j'utilise des images 16*16 pixels
#ComboHeight=#ItemHeight+6

Structure item
  Text$
  Icon.l
EndStructure

Define i.l
Global NewList Items.item()

Procedure SetDropDownHeight(Gadget.l,NumberOfItem.l)
  MoveWindow_(GadgetID(Gadget),GadgetX(Gadget),GadgetY(Gadget),GadgetWidth(Gadget),2+GadgetHeight(Gadget)+NumberOfItem*(GadgetHeight(Gadget)-6),#True)
EndProcedure

Procedure CreateIcon(Image.l)
  Protected NewIcon.ICONINFO,Mask.l,Icon.l
  
  If IsImage(Image)
    Mask=CreateImage(#PB_Any,ImageWidth(Image),ImageHeight(Image),32)
    
    NewIcon\fIcon=#True
    NewIcon\hbmMask=ImageID(Mask)
    NewIcon\hbmColor=ImageID(Image)
    
    Icon=CreateIconIndirect_(@NewIcon)
    FreeImage(Mask)
  EndIf
  
  ProcedureReturn Icon
EndProcedure

Procedure WinProc(hwnd,msg,wparam,lparam)
  Protected *dis.DRAWITEMSTRUCT,*mis.MEASUREITEMSTRUCT,Bmp.BITMAP,Text$
  Protected Result.l,hBrush.l,OldBrush.l,hdcIn.l,hdcSrc.l
  
  Result=#PB_ProcessPureBasicEvents
  
  Select msg
    Case #WM_DRAWITEM
      *dis=lparam
      If *dis\ctlid=#MyCombo
      With *dis
        Text$=GetGadgetItemText(\ctlid,\itemid)
        If \itemstate & #ODS_SELECTED
          hBrush=CreateSolidBrush_(GetSysColor_(#COLOR_HIGHLIGHT))
          OldBrush=SelectObject_(\hdc,hBrush)
          FillRect_(\hdc,\rcitem,hBrush)
          DeleteObject_(hBrush)
          SelectObject_(\hdc,OldBrush)
          If \itemid>=0 And \itemid<=CountGadgetItems(\ctlid)-1
            ChangeCurrentElement(Items(),GetGadgetItemData(\ctlid,\itemid))
            If Items()\Icon
              DrawIconEx_(\hdc,4,\rcitem\top,Items()\Icon,#ItemHeight,#ItemHeight,0,0,#DI_NORMAL|#DI_COMPAT)
            EndIf
          EndIf
          SetBkColor_(\hdc,GetSysColor_(#COLOR_HIGHLIGHT))
          TextOut_(\hdc,\rcitem\left+24,\rcitem\top+1,Text$,Len(Text$))
          DrawFocusRect_(\hdc,\rcitem)
        Else
          hBrush=CreateSolidBrush_(#White)
          OldBrush=SelectObject_(\hdc,hBrush)
          FillRect_(\hdc,\rcitem,hBrush)
          DeleteObject_(hBrush)
          SelectObject_(\hdc,OldBrush)
          If \itemid>=0 And \itemid<=CountGadgetItems(\ctlid)-1
            ChangeCurrentElement(Items(),GetGadgetItemData(\ctlid,\itemid))
            If Items()\Icon
              DrawIconEx_(\hdc,4,\rcitem\top,Items()\Icon,#ItemHeight,#ItemHeight,0,0,#DI_NORMAL)
            EndIf
          EndIf
          SetBkColor_(\hdc,#White)
          TextOut_(\hdc,\rcitem\left+24,\rcitem\top+1,Text$,Len(Text$))
        EndIf
      EndWith
      EndIf
    Case #WM_MEASUREITEM
      *mis=lparam
      If *mis\ctlid=#MyCombo
        *mis\itemheight=#ItemHeight
      EndIf
  EndSelect
  
  ProcedureReturn Result
EndProcedure

OpenWindow(0,0,0,300,50,"ComboBox avec icônes, par Octavius",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetWindowCallback(@WinProc())
ComboBoxGadget(#MyCombo,10,10,280,#ComboHeight,#CBS_OWNERDRAWVARIABLE)

For i=0 To 7
  AddElement(Items())
  Items()\Text$="Item n°"+Str(i+1)
  Items()\Icon=CreateIcon(LoadImage(#PB_Any,"Image_"+Str(i+1)+".bmp"))
  AddGadgetItem(#MyCombo,i,Items()\Text$)
  SetGadgetItemData(#MyCombo,i,@Items())
Next i

SetDropDownHeight(#MyCombo,4)

Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: ComboBoxGadget personnalisé avec icône

Message par Jacobus »

Excellent! :D
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.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: ComboBoxGadget personnalisé avec icône

Message par Kwai chang caine »

Bah dis donc ....en ce moment..t'as mangé du topset :D
Merci OCTAVIUS de tous tes codes 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: ComboBoxGadget personnalisé avec icône

Message par Octavius »

Du topset ? Mais qu'est-ce que c'est lol ?

Google est mon ami : http://fr.wikipedia.org/wiki/Topset C'est bien à ça que tu faisais allusion ?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: ComboBoxGadget personnalisé avec icône

Message par Kwai chang caine »

Et vouuuaiii !!!
"Ve mon vemp"...avvent ....ve vemet mon venvier !!! :oops:

Oui...disais-je de mon temps je regardais les pubs dont celle la
http://www.ina.fr/pub/alimentation-bois ... at.fr.html

Et il etait courant de faire cette reflexion :D
Bon je viens de prendre encore un coup de vieux moi....aller je renleve mon dentier...et je vais me coucher :?

En tout cas bravo...pour ton travail
Autrement j'aurais aussi pu dire.....qu'avec MARS ...un coup de barre ...et ça repart :lol:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: ComboBoxGadget personnalisé avec icône

Message par Octavius »

Je viens de découvrir qu'avec PureBasic 4.50 on ne peut plus changer la hauteur de la combobox avec l'API MoveWindow_() lorsque la support des thèmes XP est activé dans les options du compilateur.
Répondre