Hier der Code:
Comboboxex.pbi
Code: Alles auswählen
CompilerIf Defined(PB_GadgetVT, #PB_Structure) = #False
Structure PB_GadgetVT
GadgetType.l
SizeOf.l
GadgetCallback.l
FreeGadget.l
GetGadgetState.l
SetGadgetState.l
GetGadgetText.l
SetGadgetText.l
AddGadgetItem2.l
AddGadgetItem3.l
RemoveGadgetItem.l
ClearGadgetItemList.l
ResizeGadget.l
CountGadgetItems.l
GetGadgetItemState.l
SetGadgetItemState.l
GetGadgetItemText.l
SetGadgetItemText.l
OpenGadgetList2.l
GadgetX.l
GadgetY.l
GadgetWidth.l
GadgetHeight.l
HideGadget.l
AddGadgetColumn.l
RemoveGadgetColumn.l
GetGadgetAttribute.l
SetGadgetAttribute.l
GetGadgetItemAttribute2.l
SetGadgetItemAttribute2.l
SetGadgetColor.l
GetGadgetColor.l
SetGadgetItemColor2.l
GetGadgetItemColor2.l
SetGadgetItemData.l
GetGadgetItemData.l
EndStructure
CompilerEndIf
CompilerIf Defined(PB_Gadget, #PB_Structure) = #False
Structure PB_Gadget
Gadget.l
*VT.PB_GadgetVT
UserData.l
OldCallback.l
Daten.l[4]
EndStructure
CompilerEndIf
Global *ComboBoxExVT.PB_GadgetVT = 0
Procedure InitComboBoxEx()
Protected InitCom.INITCOMMONCONTROLSEX
InitCom\dwSize = SizeOf(INITCOMMONCONTROLSEX)
InitCom\dwICC = #ICC_USEREX_CLASSES
If InitCommonControlsEx_(InitCom)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure GetGadgetParent()
!EXTRN _PB_Object_GetThreadMemory@4
!EXTRN _PB_Gadget_Globals
!MOV Eax,[_PB_Gadget_Globals]
!push eax
!call _PB_Object_GetThreadMemory@4
!MOV Eax,[Eax]
ProcedureReturn
EndProcedure
Procedure GetGadgetObject(ID.i)
!EXTRN _PB_Object_GetObject@8
!EXTRN _PB_Gadget_Objects
!PUSH dword[p.v_ID]
!PUSH dword [_PB_Gadget_Objects]
!CALL _PB_Object_GetObject@8
ProcedureReturn
EndProcedure
Procedure AddGadgetItem3CBex(*Gadget.PB_Gadget,Position.l,Text.s, Image, Flags.l)
Protected Index
Index = ImageList_Add_(*Gadget\Daten[0],Image,0)
If Index <> -1
Protected Entry.COMBOBOXEXITEM
#CBEIF_TEXT = 1
#CBEIF_IMAGE = 2
#CBEIF_SELECTEDIMAGE = 4
With Entry
\mask = #CBEIF_IMAGE | #CBEIF_TEXT | #CBEIF_SELECTEDIMAGE
\iItem = Position
\pszText = @Text
\cchTextMax = Len(Text)
\iSelectedImage = Index
\iImage = Index
EndWith
ProcedureReturn SendMessage_(*Gadget\Gadget,#CBEM_INSERTITEM,0,Entry)
EndIf
ProcedureReturn #False
EndProcedure
Procedure AddGadgetItem2CBex(*Gadget.PB_Gadget,Position.l,Text.s, Image)
AddGadgetItem3CBex(*Gadget.PB_Gadget,Position.l,Text.s, Image,0)
EndProcedure
Procedure RemoveGadgetItemEx(*Gadget.PB_Gadget,Position.l)
Protected Entry.COMBOBOXEXITEM
Protected Image.i
Protected Count.i
Protected i.i
Entry\iItem = Position
Entry\mask = #CBEIF_IMAGE
If SendMessage_(*Gadget\Gadget,#CBEM_GETITEM,0,Entry)
Image = Entry\iImage
#CBEM_DELETEITEM = #CB_DELETESTRING
Count = SendMessage_(*Gadget\Gadget,#CBEM_DELETEITEM,Position,0)
If Count <> #CB_ERR
If ImageList_Remove_(*Gadget\Daten[0],Image)
For i = Position To Count -1
Entry\iItem = i
Entry\mask = #CBEIF_IMAGE | #CBEIF_SELECTEDIMAGE
If SendMessage_(*Gadget\Gadget,#CBEM_GETITEM,0,Entry)
Entry\iImage - 1
Entry\iSelectedImage - 1
SendMessage_(*Gadget\Gadget,#CBEM_SETITEM,0,Entry)
EndIf
Next
ProcedureReturn #True
EndIf
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure OwnWndProc(hWnd.i, message.i, wParam.i, lParam.i)
ProcedureReturn DefWindowProc_(hWnd.i, message.i, wParam.i, lParam.i)
EndProcedure
Procedure ComboBoxExGadget(Gadget.i, x.i, y.i, Breite.i, Hoehe.i,Flags.i=0,ImageWidth.i=16,ImageHeight.i=16)
Protected GadgetHandle.l
Protected *GadgetInfo.PB_Gadget
Protected oldHwnd.i
Protected Hwnd.i
If Gadget = #PB_Any
GadgetHandle = ComboBoxGadget(Gadget.i, x.i, y.i, Breite.i, Hoehe.i, Flags.i)
If GadgetHandle = 0
ProcedureReturn #False
EndIf
Else
If ComboBoxGadget(Gadget.i, x.i, y.i, Breite.i, Hoehe.i, Flags.i) = #False
ProcedureReturn #False
Else
GadgetHandle = Gadget
EndIf
EndIf
oldHwnd = GadgetID(GadgetHandle)
*GadgetInfo = GetGadgetObject(GadgetHandle) ;GetProp_(oldHwnd,"GadgetInfo")
If *GadgetInfo
Hwnd = CreateWindowEx_(0,"ComboBoxEx32",0 ,#WS_CHILD| #WS_VISIBLE |#CBS_DROPDOWN | #CBS_AUTOHSCROLL | #WS_VSCROLL | #CBS_DROPDOWNLIST | Flags,x,y,Breite,Hoehe,GetGadgetParent(),GetDlgCtrlID_(oldHwnd),GetModuleHandle_(0),0)
If Hwnd
If *ComboBoxExVT = 0
*ComboBoxExVT = AllocateMemory(*GadgetInfo\VT\SizeOf)
If *ComboBoxExVT
CopyMemory(*GadgetInfo\VT, *ComboBoxExVT, *GadgetInfo\VT\SizeOf)
; Modify V-Table
*ComboBoxExVT\AddGadgetItem2 = @AddGadgetItem2CBex()
*ComboBoxExVT\AddGadgetItem3 = @AddGadgetItem3CBex()
*ComboBoxExVT\RemoveGadgetItem = @RemoveGadgetItemEx()
EndIf
EndIf
If *ComboBoxExVT
*GadgetInfo\VT = *ComboBoxExVT
*GadgetInfo\Gadget = Hwnd
*GadgetInfo\VT\AddGadgetItem2 = @AddGadgetItem2CBex()
*GadgetInfo\Daten[0] = ImageList_Create_(ImageWidth,ImageHeight, #ILC_COLOR24,0,1)
If *GadgetInfo\Daten[0]
#CBEM_SETIMAGELIST = (#WM_USER + 2)
SendMessage_(Hwnd,#CBEM_SETIMAGELIST,0,*GadgetInfo\Daten[0])
SetWindowLongPtr_(oldHwnd,#GWLP_WNDPROC,@OwnWndProc())
DestroyWindow_(oldHwnd)
If Gadget = #PB_Any
ProcedureReturn GadgetHandle
Else
ProcedureReturn #True
EndIf
EndIf
EndIf
EndIf
DestroyWindow_(oldHwnd)
EndIf
ProcedureReturn #False
EndProcedure
Testcode:
Code: Alles auswählen
XIncludeFile "comboboxex.pbi"
If OpenWindow(0,0,0,300,300,"Test")
ComboBoxExGadget(1,0,0,200,200,0,64,64)
CreateImage(1,64,64,32)
StartDrawing(ImageOutput(1))
Box(0,0,64,64,RGB(255,0,0))
Box(10,10,44,44,RGB(0,0,255))
StopDrawing()
AddGadgetItem(1,-1,"Test",ImageID(1))
AddGadgetItem(1,-1,"Test 2",ImageID(1))
AddGadgetItem(1,-1,"Test 3",ImageID(1))
SetGadgetState(1,1)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget() = 1
Debug "Changed!"
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Mfg,
DarkPlayer