Seite 1 von 1

Combobox in eine ListIconGadget

Verfasst: 27.07.2015 23:44
von marcelx
Hallo,

ist es möglich Combobox in eine ListIconGadget einzubauen ?

Danke und Gruß
MarcelX

Re: Combobox in eine ListIconGadget

Verfasst: 28.07.2015 08:30
von Shardik
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-Beispiel

Code: Alles auswählen

If EventType() = 1
gegen

Code: Alles auswählen

If EventType() = #PB_EventType_Change
ausgetauscht werden und das Beispiel funktioniert wieder... :wink:

Dabei sollte auch direkt

Code: Alles auswählen

Until EventID = #WM_CLOSE
in

Code: Alles auswählen

Until EventID = #PB_Event_CloseWindow
abgeändert werden, damit das Programm in neueren PureBasic-Versionen korrekt beendet werden kann und die Zeile

Code: Alles auswählen

CreateGadgetList(WindowID(0))
sollte gelöscht werden.

Re: Combobox in eine ListIconGadget

Verfasst: 28.07.2015 12:55
von marcelx
Danke Shardik für die ausführliche Infos.
Ich werde es gleich ausprobieren.

Re: Combobox in eine ListIconGadget

Verfasst: 28.07.2015 15:24
von marcelx
ich möchte die Ids als Enumeration:

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
Für MapWindowPoints_(#Id_??,hwnd,@cp,1), welche ID muss da rein?

Re: Combobox in eine ListIconGadget

Verfasst: 28.07.2015 15:37
von Shardik
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

Re: Combobox in eine ListIconGadget

Verfasst: 28.07.2015 15:40
von marcelx
Super, danke