Daffy0815 hat geschrieben:Könntest Du bitte das mit dem "OwnerDraw" etwas näher spezifizieren.
Anbei mal eine auf Deine Bedürfnisse angepasste Variante des
ComboBox_OwnerDraw Beispiels von Fred (also nun mit großen Icons und großer Schrift) aus dem Jahr 2003:
(getestet mit 4.50 RC1 und neuer Gadget-Lib (s. Link oben))
Code: Alles auswählen
; English forum: http://www.purebasic.fr/english/viewtopic.php?t=8674&highlight=
; Author: Fred
; Date: 09. December 2003
; OS: Windows
; Demo: No
; ComboBox OwnerDraw in PureBasic
;
Enumeration
#Window_0
EndEnumeration
Enumeration
#Gadget_0
EndEnumeration
LoadFont(0,"Arial", 23)
Procedure Open_Window_0()
If OpenWindow(#Window_0, 0, 0, 400, 200, "ComboBox OwnerDraw", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_0))
ComboBoxGadget(#Gadget_0, 60, 40, 330, 40, #CBS_OWNERDRAWFIXED)
SendMessage_(GadgetID(ComboBoxGadget), #CB_SETITEMHEIGHT, GadgetID(ComboBoxGadget), 40) ;<= hier wird die Höhe der PullDown-Items festgelegt
SetGadgetFont(0,FontID(0)) ; Und natürlich nicht vergessen den größeren Font einzustellen
EndIf
EndIf
EndProcedure
Open_Window_0()
#DI_NORMAL = $0003
Procedure WindowCallback(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_DRAWITEM
*DrawItem.DRAWITEMSTRUCT = lParam
If *DrawItem\CtlType = #ODT_COMBOBOX
SetBkMode_(*DrawItem\hDC, #TRANSPARENT) ; Text is rendered transparent
If *DrawItem\ItemState & #ODS_FOCUS
Brush = CreateSolidBrush_($FFEEFF)
FillRect_(*DrawItem\hDC, *DrawItem\rcItem, Brush)
DeleteObject_(Brush)
SetTextColor_(*DrawItem\hDC, $FF)
Else
FillRect_(*DrawItem\hDC, *DrawItem\rcItem, GetStockObject_(#WHITE_BRUSH))
EndIf
If *DrawItem\itemID <> -1
Text$ = Space(512)
Debug SendMessage_(*DrawItem\hwndItem, #CB_GETLBTEXTLEN, *DrawItem\itemID, 0) ; Hmmm, Länge des Item-Textes ist immer 4 ???
SendMessage_(*DrawItem\hwndItem, #CB_GETLBTEXT, *DrawItem\itemID, @Text$)
; nachfolgend müstest Du statt "LoadIcon_(0, #IDI_ASTERISK)" dann Deine ImageID für diese Zeile übergeben.
DrawIconEx_(*DrawItem\hDC, *DrawItem\rcItem\left+2 , *DrawItem\rcItem\top+1, LoadIcon_(0, #IDI_ASTERISK), 32, 32, 0, 0, #DI_NORMAL)
TextOut_ (*DrawItem\hDC, *DrawItem\rcItem\left+2+40, *DrawItem\rcItem\top+1, Text$, Len(Text$)) ; die "+40" ist der Offest des Textes, um Platz für das Icon zu machen.
EndIf
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
SetWindowCallback(@WindowCallback())
AddGadgetItem(#Gadget_0, -1, "Hmmmm ...")
AddGadgetItem(#Gadget_0, -1, "Der Text der")
AddGadgetItem(#Gadget_0, -1, "Items wird")
AddGadgetItem(#Gadget_0, -1, "nicht korrekt")
AddGadgetItem(#Gadget_0, -1, "angezeigt.")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
End
; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
; EnableXP
Nur werden die Texte aus den Items nicht richtig angezeigt.
Ob sich da nun inzwischen seit 2003 etwas geändert hat, ein Fehler in Freds Beispiel ist oder das halt einer der bekannten 4.50er Bugs ist kann ich nicht sagen.
Wenn's mit PB 4.4 korrekt funktioniert, wird's an PB 4.5 liegen.
Ansonsten kann Dir da vielleicht einer unserer API-Päpste hier weiter helfen. . . . *zu
edel rüberschiel*
