laut MSDN sollte mit #LBS_NODATA auf externe (nicht in der 'Listbox' gespeicherte) Daten zugegriffen werden.
Nach Packungsangabe zusammengestellt, tut aber nicht ...
Vielleicht sieht ja jemand den Fehler.
Code: Alles auswählen
;' Testcode zur Fehlersuche fürs Forum ..
EnableExplicit
#GADGET_Output = 3
Global Dim arr$(30)
arr$(0) = "Array Item #1"
arr$(1) = "Array Item #2"
arr$(2) = "Array Item #3"
arr$(3) = "Array Item #4"
arr$(4) = "Array Item #5"
Procedure __MainWindowCB(hWnd, uMsg, wParam, lParam) ;' callback
Static hBrushBackground, hBrushDefault, hBrushSelected, hBrushSelectedFocus
Protected result, rc.RECT, sz.SIZE
Protected idx, item$, tx$, Checkbox$
Protected xSelected, dtFlags, currentTextColor, hOldFont, ww, wh
Protected *lpdis.DRAWITEMSTRUCT
Select uMsg
Case -1 ;- call with uMsg == -1 to initial the callback
hBrushBackground = CreateSolidBrush_(GetSysColor_(#COLOR_WINDOW)) ;' background of the control
SetWindowLongPtr_(hWnd, #GWL_USERDATA, GetWindowLongPtr_(hWnd, #GWL_WNDPROC)) ;' keep the window procedure address
SetWindowLongPtr_(hWnd, #GWL_WNDPROC, @__MainWindowCB()) ;' set window procedure to my callback procedure
Case #WM_NCDESTROY :Debug "subclass: WM_NCDESTROY "
DeleteObject_(hBrushBackground)
Case #WM_DRAWITEM ;..message is sent to all windows when the display resolution has changed.
If wParam = #GADGET_Output :Debug "subclass: WM_DRAWITEM "
*lpdis = lParam
idx = *lpdis\itemID
If *lpdis\itemID <> -1
;item$ = GetGadgetItemText(#GADGET_Output, *lpdis\itemID, 0) :Debug " Item["+idx+"] = '"+item$+"'"
item$ = arr$(idx) :Debug " Item["+idx+"] = '"+item$+"'"
; dtFlags = #DT_LEFT|#DT_WORDBREAK|#DT_END_ELLIPSIS
FillRect_(*lpdis\hdc, *lpdis\rcItem, hBrushBackground) ;' clear item rect with background color
SetBkMode_(*lpdis\hdc, #TRANSPARENT)
SetTextColor_(*lpdis\hdc, #Black)
TextOut_(*lpdis\hdc, *lpdis\rcItem\left+2, *lpdis\rcItem\top + 2, @item$, Len(item$))
EndIf
EndIf
EndSelect ; uMsg
ProcedureReturn CallWindowProc_(GetWindowLongPtr_(hWnd, #GWL_USERDATA), hWnd, uMsg, wParam, lParam) ;' use stored window procedure address
EndProcedure
Define nn , Event
For nn = 0 To 4
Debug " arr("+nn+") = '"+arr$(nn)+"'"
Next nn
If OpenWindow(0, 0, 0, 240, 240, "Event handling example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
__MainWindowCB(WindowID(0), -1, 0, 0) ;' strange, but works :-)
CompilerIf 10 ;' change from nonzero to zero !!!
ListViewGadget(#GADGET_Output, 10, 10, 200, 200, #LBS_OWNERDRAWFIXED|#LBS_NODATA)
;Debug "Style.0 = 0x"+Hex(GetWindowLong_(GadgetID(#GADGET_Output), #GWL_STYLE), #PB_Long)
; onstyle = #LBS_OWNERDRAWFIXED|#LBS_NODATA
; SetWindowLong_(GadgetID(#GADGET_Output), #GWL_STYLE, GetWindowLong_(GadgetID(#GADGET_Output), #GWL_STYLE) | onstyle)
;Debug "Style.1 = 0x"+Hex(GetWindowLong_(GadgetID(#GADGET_Output), #GWL_STYLE), #PB_Long)
; offstyle = #LBS_HASSTRINGS|#LBS_SORT| #WS_EX_STATICEDGE| #WS_EX_CONTROLPARENT |#LBS_NOINTEGRALHEIGHT
; SetWindowLong_(GadgetID(#GADGET_Output), #GWL_STYLE, GetWindowLong_(GadgetID(#GADGET_Output), #GWL_STYLE) & ~offstyle)
;Debug "Style.2 = 0x"+Hex(GetWindowLong_(GadgetID(#GADGET_Output), #GWL_STYLE), #PB_Long)
Debug ""
;' MSDN: this is used with #LBS_NODATA
Debug "#LB_SETCOUNT = "+SendMessage_(GadgetID(#GADGET_Output), #LB_SETCOUNT, 4, 0) ;' wParam = count of items
Debug "#LB_GETCOUNT = " + SendMessage_(GadgetID(#GADGET_Output), #LB_GETCOUNT, 0, 0) ;' wParam = count of items
CompilerElse
ListViewGadget(#GADGET_Output, 10, 10, 200, 200, #LBS_OWNERDRAWFIXED|#LBS_HASSTRINGS)
Debug "Style.1 = 0x"+Hex(GetWindowLong_(GadgetID(#GADGET_Output), #GWL_STYLE), #PB_Long)
AddGadgetItem(3, -1, "1") ;' dummy, because draw proc is using array !
AddGadgetItem(3, -1, "2")
AddGadgetItem(3, -1, "3")
AddGadgetItem(3, -1, "4")
AddGadgetItem(3, -1, "5")
Debug "#LB_GETCOUNT = " + SendMessage_(GadgetID(#GADGET_Output), #LB_GETCOUNT, 0, 0) ;' wParam = count of items
CompilerEndIf
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #GADGET_Output : Debug "Listbox clicked!"
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
Leider gibt die Zeile "Debug "#LB_SETCOUNT = "+SendMessage_(GadgetID(#GADGET_Output), #LB_SETCOUNT, 4, 0) ;' wParam = count of items " mit -1 (#LB_ERR) einen Fehler aus.
Wenn man die Zeile "CompilerIf 10" auf "CompilerIf 0" ändert, dann gehts wie immer
Danke für jede Art von Tipp.
Grüße Andreas