Ich habe bisher auch keine bessere Lösung gefunden.
Code: Alles auswählen
Global Dim Eintrag.s(9)
#POS_NORMAL = 0
#POS_HCENTER = 1
#POS_VCENTER = 2
#POS_HVCENTER = 3
For i = 0 To ArraySize(Eintrag())
Eintrag(i) = "Eintrag "+Str(i)
Next i
Procedure ComboBoxExtra(cid, Array item.s(1), *DRAWITEM.DRAWITEMSTRUCT, align = 0, fgcolor = $0, bgcolor = $FFFFFF)
Protected w, h, hp, vp, TextSize.SIZE
w = GadgetWidth(cid)
h = GadgetHeight(cid)
;fgbrush = CreateSolidBrush_(fgcolor)
bgbrush = CreateSolidBrush_(bgcolor)
If *DRAWITEM\CtlType = #ODT_COMBOBOX
id = *DRAWITEM\itemID
If id >= 0 And *DRAWITEM\CtlID = cid
InflateRect_(*DRAWITEM\rcItem,-1,-1)
FillRect_(*DRAWITEM\hDC,*DRAWITEM\rcItem,bgbrush)
FrameRect_(*DRAWITEM\hDC,*DRAWITEM\rcItem,bgbrush)
SetBkColor_(*DRAWITEM\hDC, bgcolor)
SetTextColor_(*DRAWITEM\hDC, fgcolor)
If align = 0
*DRAWITEM\rcItem\left = 4
ElseIf align = 1
If GetTextExtentPoint32_(*DRAWITEM\hDC, item(id), Len(item(id)), @TextSize)
hp = (GadgetWidth(cid)/2) - (TextSize\cx / 2) - 4
*DRAWITEM\rcItem\left = hp
EndIf
ElseIf align = 2
If GetTextExtentPoint32_(*DRAWITEM\hDC, item(id), Len(item(id)), @TextSize)
vp = (GadgetHeight(cid)/2) - (TextSize\cy / 2) - 4
*DRAWITEM\rcItem\left = 4
*DRAWITEM\rcItem\top + vp
EndIf
ElseIf align = 3
If GetTextExtentPoint32_(*DRAWITEM\hDC, item(id), Len(item(id)), @TextSize)
hp = (GadgetWidth(cid)/2) - (TextSize\cx / 2) - 4
vp = (GadgetHeight(cid)/2) - (TextSize\cy / 2) - 4
*DRAWITEM\rcItem\left = hp
*DRAWITEM\rcItem\top + vp
EndIf
EndIf
DrawText_(*DRAWITEM\hDC, item(id), -1, *DRAWITEM\rcItem, #DT_NOCLIP)
EndIf
EndIf
EndProcedure
Procedure WndProc(hwnd, uMsg, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_DRAWITEM
fgcolor = RGB(0,255,0)
bgcolor = RGB(255,255,0)
*DRAWITEM.DRAWITEMSTRUCT = lParam
ComboBoxExtra(1, Eintrag(), *DRAWITEM.DRAWITEMSTRUCT, #POS_HVCENTER, fgcolor, bgcolor)
EndSelect
ProcedureReturn Result
EndProcedure
;-Main
OpenWindow(0,0,0,640,480, "Mein ComboBox-Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget )
SetWindowCallback(@WndProc())
ComboBoxGadget(1,10,10,180, 40,#CBS_OWNERDRAWFIXED)
;Der Eintragstext steht im Array Eintrag()
AddGadgetItem(1,-1, "")
AddGadgetItem(1,-1, "")
AddGadgetItem(1,-1, "")
SendMessage_(GadgetID(1),#CB_SETITEMHEIGHT,0,40)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow