Page 1 sur 1

ComboBoxGadget personnalisé avec icône

Publié : mer. 21/oct./2009 13:48
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

Re: ComboBoxGadget personnalisé avec icône

Publié : mer. 21/oct./2009 18:07
par Jacobus
Excellent! :D

Re: ComboBoxGadget personnalisé avec icône

Publié : jeu. 22/oct./2009 9:05
par Kwai chang caine
Bah dis donc ....en ce moment..t'as mangé du topset :D
Merci OCTAVIUS de tous tes codes 8)

Re: ComboBoxGadget personnalisé avec icône

Publié : jeu. 22/oct./2009 15:14
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 ?

Re: ComboBoxGadget personnalisé avec icône

Publié : ven. 23/oct./2009 17:23
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:

Re: ComboBoxGadget personnalisé avec icône

Publié : dim. 29/août/2010 20:50
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.