Hallo,
ist es möglich Combobox in eine ListIconGadget einzubauen ?
Danke und Gruß
MarcelX
Combobox in eine ListIconGadget
Combobox in eine ListIconGadget
Win-10, PB 5.31 (Windows - x86)
Re: Combobox in eine ListIconGadget
Im englischen Forum gibt es ein altes Beispiel von netmaestro dazu. Allerdings funktioniert die Übernahme des in der ComboBox ausgewählten Eintrags in die Zelle des ListIconGadgets nur bis PB 4.51, weil netmaestro für die EventType()-Abfrage die Ziffer 1 (die in PB 4.51 für #PB_EventType_TitleChange steht) benutzt hat. Ab PB 4.60 muß aber auf #PB_EventType_Change abgefragt werden. Also sollte in der Ereignisschleife Repeat... Until EventID = #WMCLOSE von netmaestros Code-Beispielgegenausgetauscht werden und das Beispiel funktioniert wieder... 
Dabei sollte auch direktinabgeändert werden, damit das Programm in neueren PureBasic-Versionen korrekt beendet werden kann und die Zeile sollte gelöscht werden.
Code: Alles auswählen
If EventType() = 1
Code: Alles auswählen
If EventType() = #PB_EventType_Change

Dabei sollte auch direkt
Code: Alles auswählen
Until EventID = #WM_CLOSE
Code: Alles auswählen
Until EventID = #PB_Event_CloseWindow
Code: Alles auswählen
CreateGadgetList(WindowID(0))
Re: Combobox in eine ListIconGadget
Danke Shardik für die ausführliche Infos.
Ich werde es gleich ausprobieren.
Ich werde es gleich ausprobieren.
Win-10, PB 5.31 (Windows - x86)
Re: Combobox in eine ListIconGadget
ich möchte die Ids als Enumeration:
Für MapWindowPoints_(#Id_??,hwnd,@cp,1), welche ID muss da rein?
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
Win-10, PB 5.31 (Windows - x86)
Re: Combobox in eine ListIconGadget
So funktioniert netmaestros Beispiel auch mit Enumeration der Gadget-IDs:
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_(0,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
ResizeGadget(#Id_combo, itemrect\left, itemrect\top, itemrect\right-itemrect\left, itemrect\bottom-itemrect\top)
SetGadgetState(#Id_combo,0)
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_combo
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