Code: Alles auswählen
Enumeration 10
#Id_win
#Id_list
#Id_combo
EndEnumeration
#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56
Global oldproc
Global currentitem, currentsubitem
Procedure MainWindowCallBack(hwnd, msg, wparam, lparam)
result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_DRAWITEM
*lpdis.DRAWITEMSTRUCT = lparam
Dim itemrect.RECT(3)
For i = 1 To 3
RtlZeroMemory_(@itemrect(i),SizeOf(RECT))
itemrect(i)\top = i
SendMessage_(*lpdis\hwndItem, #LVM_GETSUBITEMRECT, *lpdis\itemid, @itemrect(i))
text$ = GetGadgetItemText(GetDlgCtrlID_(*lpdis\hwndItem), *lpdis\itemid, i)
SelectObject_(*lpdis\hDC, GetStockObject_(#NULL_PEN))
WhiteBrush = CreateSolidBrush_(#White)
SelectObject_(*lpdis\hDC, WhiteBrush)
Rectangle_(*lpdis\hDC, itemrect(i)\left+4, itemrect(i)\top+4, itemrect(i)\right, itemrect(i)\bottom)
TextOut_(*lpdis\hDC, itemrect(i)\left+4, itemrect(i)\top+4, text$, Len(text$))
DeleteObject_(WhiteBrush)
Next
Case #WM_MEASUREITEM
*lpmis.MEASUREITEMSTRUCT = lparam
*lpmis\itemheight = 20
EndSelect
ProcedureReturn result
EndProcedure
Procedure SubClass_LV(hwnd, msg, wparam, lparam)
result = CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
If msg = #WM_RBUTTONDOWN Or msg = #WM_LBUTTONDOWN
GetCursorPos_(@cp.POINT)
MapWindowPoints_(#Id_??,hwnd,@cp,1)
HitInfo.LVHITTESTINFO
Hitinfo\pt\x = cp\x
HitInfo\pt\y = cp\y
SendMessage_(hwnd,#LVM_SUBITEMHITTEST ,0,@HitInfo)
If hitinfo\isubitem > 0 And HitInfo\iItem >= 0
currentitem = hitinfo\iitem
currentsubitem = hitinfo\isubitem
RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT))
itemrect\top = hitinfo\iSubItem
SendMessage_(hwnd,#LVM_GETSUBITEMRECT, hitinfo\iitem, @itemrect)
If HitInfo\iSubItem = 3
input.s = GetGadgetItemText(#Id_list, currentitem, currentsubitem)
pos = 0
For i = 0 To CountGadgetItems(#Id_combo)
If GetGadgetItemText(#Id_combo, i) = input
pos = i
Break
EndIf
Next
ResizeGadget(#Id_combo, itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top)
SetGadgetState(1, pos)
HideGadget(#Id_combo,0)
Else
HideGadget(#Id_combo,1)
EndIf
Else
HideGadget(#Id_combo,1)
EndIf
EndIf
ProcedureReturn result
EndProcedure
OpenWindow(#Id_win,0,0,320,240,"Test ...",$CF0001)
SetWindowCallback(@MainWindowCallBack())
ListIconGadget(#Id_list,0,0,320,240,"",0,#PB_ListIcon_GridLines|#LVS_OWNERDRAWFIXED)
oldproc = SetWindowLong_(GadgetID(#Id_list), #GWL_WNDPROC, @SubClass_LV())
AddGadgetColumn(#Id_list,1,"FirstName",100)
AddGadgetColumn(#Id_list,2,"LastName",100)
AddGadgetColumn(#Id_list,3,"City",115)
AddGadgetItem(#Id_list, -1, Chr(10) + "Lloyd" + Chr(10) + "Gallant" + Chr(10) )
AddGadgetItem(#Id_list, -1, Chr(10) + "Eric" + Chr(10) + "Penrose" + Chr(10) )
AddGadgetItem(#Id_list, -1, Chr(10) + "Mark" + Chr(10) + "Dutton" + Chr(10) )
AddGadgetItem(#Id_list, -1, Chr(10) + "Tim" + Chr(10) + "Knechtel" + Chr(10) )
ComboBoxGadget(#Id_combo, 0,20,100,200,#PB_Window_Invisible)
SetParent_(GadgetID(#Id_combo),GadgetID(#Id_list))
AddGadgetItem(#Id_combo,0,"")
AddGadgetItem(#Id_combo,1,"Toronto")
AddGadgetItem(#Id_combo,2,"Kitchener")
AddGadgetItem(#Id_combo,3,"Waterloo")
AddGadgetItem(#Id_combo,4,"Barrie")
HideGadget(#Id_combo,1)
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
Case #Id_list
If EventType() = #PB_EventType_Change
SetGadgetItemText(#Id_list, currentitem, GetGadgetText(#Id_combo), currentsubitem)
HideGadget(#Id_combo,1)
EndIf
EndSelect
EndSelect
Until EventID = #PB_Event_CloseWindow