für ein kleines Projekt habe ich ein Gadget benötigt, das sich etwa aus einer Kombination von TreeGadget + ListIconGadget beschreiben lässt. Herausgekommen ist folgender Code:
Code: Alles auswählen
Procedure GetHeaderHeight(GadgetID.l)
  Header.RECT
  GetWindowRect_(SendMessage_(GadgetID(GadgetID.l) , #LVM_GETHEADER , 0 , 0) , Header)
  ProcedureReturn Header\bottom - Header\top
EndProcedure
Procedure WindowCallBack(Window ,  message ,  wParam ,  lParam)
  Protected wWidth.l ,  wHeight.l ,  Gadget_ID.l ,  AktColumn.l ,  LastColumn.l  
  Protected *pnmtv.NM_TREEVIEW
  ReturnValue  =  #PB_ProcessPureBasicEvents  
  Select message   
    Case #WM_NOTIFY  
      *nmHEADER.HD_NOTIFY = lParam  
      Gadget_ID = *nmHEADER\hdr\hwndFrom  
      Select *nmHEADER\hdr\code  
        Case #HDN_ITEMCHANGING ; is header item changing?  
          Select GetParent_(Gadget_ID)  
            Case GadgetID(2) 
              If *nmHEADER\iItem = 0
                Width.l = GetGadgetItemAttribute(2 ,  - 1 , #PB_ListIcon_ColumnWidth , 0)
                ResizeGadget(8 , Width.l , #PB_Ignore , 300 - Width.l , #PB_Ignore)
                ResizeGadget(0 , #PB_Ignore , #PB_Ignore , 300 - Width.l , #PB_Ignore)
                ResizeGadget(1 , #PB_Ignore , #PB_Ignore , Width.l , #PB_Ignore)
              ElseIf *nmHEADER\iItem = 1
                ReturnValue  =  #True  
              EndIf  
          EndSelect  
      EndSelect 
      *pnmtv = lParam
      Select *pnmtv\hdr\code
        Case #TVN_ITEMEXPANDED
          TreeListGadgetItem  =  *pnmtv\itemNew\lParam
          Select *pnmtv\action
            Case 1
              TreeListGadgetItemExpanded = 1
            Case 2
              TreeListGadgetItemExpanded = 2
          EndSelect
      EndSelect
  EndSelect  
  ProcedureReturn ReturnValue  
EndProcedure  
Procedure TreeListGadget_AddItem(Position.l , Text1.s , Text2.s , ImageID1.l , ImageID2.l , SubLevel.l)
  AddGadgetItem(1 , Position.l , Text1.s , ImageID1.l , SubLevel.l)
  AddGadgetItem(0 , Position.l , Text2.s , ImageID2.l , SubLevel.l)
EndProcedure
Procedure TreeListGadget_DeleteItem(Position.l)
  RemoveGadgetItem(1 , Position.l)
  RemoveGadgetItem(0 , Position.l)
EndProcedure
If OpenWindow(0 , 100 , 100 , 320 , 250 , "TreeListGadget" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ContainerGadget(5 , 10 , 10 , 300 , 151 , #PB_Container_Flat) 
    SetGadgetColor(5 , #PB_Gadget_BackColor , RGB(255 , 255 , 255))
    
    ContainerGadget(3 , 0 , 0 , GadgetWidth(5) - (GetSystemMetrics_(#SM_CYEDGE)/2) , 100 , #PB_Container_BorderLess) 
        ListIconGadget(2 , 0 , 0 , GadgetWidth(5) + 5 , 100 , "City" , 150 , #LVS_NOSCROLL)
        AddGadgetColumn(2 , 1 , "Name" , 300)
        AddGadgetItem(2 ,  - 1 , "" + Chr(10) + "")
        SetGadgetColor(2 , #PB_Gadget_BackColor , RGB(245 , 245 , 245))
        SetGadgetItemColor(2 , 0 , #PB_Gadget_BackColor , RGB(255 , 255 , 255) , 1)
        SetWindowLong_(GadgetID(2) , #GWL_EXSTYLE , GetWindowLong_(GadgetID(2) , #GWL_EXSTYLE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_BORDER) & (~#WS_DLGFRAME) & (~#WS_VSCROLL) & (~#WS_HSCROLL) & (~#WS_THICKFRAME) & (~#WS_EX_DLGMODALFRAME) & (~#WS_EX_WINDOWEDGE) & (~#WS_EX_LEFTSCROLLBAR ) & (~#WS_EX_RIGHTSCROLLBAR) & (~#WS_EX_STATICEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE))  
        SetWindowPos_(GadgetID(2) , 0 , 0 , 0 , 0 , 0 , #SWP_SHOWWINDOW | #SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
        ResizeGadget(2 , #PB_Ignore , #PB_Ignore , #PB_Ignore , GetHeaderHeight(2))
        ResizeGadget(3 , #PB_Ignore , #PB_Ignore , #PB_Ignore , GetHeaderHeight(2))
      CloseGadgetList()
      
      ContainerGadget(9 , 0 , GetHeaderHeight(2) , (GadgetWidth(5)/2) - (GetSystemMetrics_(#SM_CYEDGE)/2) , GadgetHeight(5) - GetHeaderHeight(2) - GetSystemMetrics_(#SM_CYEDGE) , #PB_Container_BorderLess) 
        TreeGadget(1 , 0 , 0 , (GadgetWidth(5)/2) - (GetSystemMetrics_(#SM_CYEDGE)/2) + GetSystemMetrics_(#SM_CXVSCROLL) , GadgetHeight(5) - GetHeaderHeight(2) - GetSystemMetrics_(#SM_CYEDGE) , #PB_Tree_CheckBoxes | #PB_Tree_NoLines)  ; TreeGadget mit Checkboxen  +  ohne Linien
        SetWindowLong_(GadgetID(1) , #GWL_EXSTYLE , GetWindowLong_(GadgetID(1) , #GWL_EXSTYLE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_BORDER) & (~#WS_DLGFRAME) & (~#WS_VSCROLL) & (~#WS_HSCROLL) & (~#WS_THICKFRAME) & (~#WS_EX_DLGMODALFRAME) & (~#WS_EX_WINDOWEDGE) & (~#WS_EX_LEFTSCROLLBAR ) & (~#WS_EX_RIGHTSCROLLBAR) & (~#WS_EX_STATICEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE))  
        SetWindowPos_(GadgetID(1) , 0 , 0 , 0 , 0 , 0 , #SWP_SHOWWINDOW | #SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
        SetWindowLong_(GadgetID(1) ,  #GWL_STYLE ,  GetWindowLong_(GadgetID(1) ,  #GWL_STYLE) & ~#WS_HSCROLL)
        SetWindowPos_(GadgetID(1) , 0 , 0 , 0 , 0 , 0 , #SWP_NOMOVE | #SWP_NOSIZE | #SWP_NOZORDER | #SWP_FRAMECHANGED)
      CloseGadgetList()
        
      ContainerGadget(8 , GadgetWidth(5)/2 , GetHeaderHeight(2) , (GadgetWidth(5)/2) - (GetSystemMetrics_(#SM_CYEDGE)/2) , GadgetHeight(5) - GetHeaderHeight(2) - GetSystemMetrics_(#SM_CYEDGE) , #PB_Container_BorderLess) 
        TreeGadget(0 , 0 , 0 , (GadgetWidth(5)/2) - (GetSystemMetrics_(#SM_CYEDGE)/2) + GetSystemMetrics_(#SM_CXVSCROLL) , GadgetHeight(5) - GetHeaderHeight(2) - GetSystemMetrics_(#SM_CYEDGE) , #PB_Tree_NoLines | #PB_Tree_NoButtons)
        SetGadgetColor(0 , #PB_Gadget_BackColor , GetSysColor_(#COLOR_3DFACE) )
        SetWindowLong_(GadgetID(0) , #GWL_EXSTYLE , GetWindowLong_(GadgetID(0) , #GWL_EXSTYLE)  & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_BORDER) & (~#WS_DLGFRAME) & (~#WS_VSCROLL) & (~#WS_HSCROLL) & (~#WS_THICKFRAME) & (~#WS_EX_DLGMODALFRAME) & (~#WS_EX_WINDOWEDGE) & (~#WS_EX_LEFTSCROLLBAR ) & (~#WS_EX_RIGHTSCROLLBAR) & (~#WS_EX_STATICEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE) & (~#WS_EX_CLIENTEDGE))  
        SetWindowPos_(GadgetID(0) , 0 , 0 , 0 , 0 , 0 , #SWP_SHOWWINDOW | #SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
        SendMessage_(GadgetID(0) , #TVM_SETINDENT ,  - 1 , 0)
        EnableWindow_(GadgetID(0) , #False)
      CloseGadgetList() 
  CloseGadgetList() 
  
  ;Add some buttons
  ButtonGadget(100 , 10 , 180 , 100 , 25 , "Add item")
  ButtonGadget(101 , 10 , 210 , 100 , 25 , "Delete item")
  
  SetWindowCallback(@WindowCallBack())  
   Repeat
     Event = WaitWindowEvent()
     If Event = #PB_Event_Gadget
        If EventGadget() = 1
          Select TreeListGadgetItemExpanded
          Case 1
            SetGadgetItemState(0 , TreeListGadgetItem , #PB_Tree_Collapsed)
          Case 2
            SetGadgetItemState(0 , TreeListGadgetItem , #PB_Tree_Expanded)
        EndSelect
          If GetWindowLong_(GadgetID(0) , #GWL_STYLE) & #WS_VSCROLL
            ResizeGadget(8 , #PB_Ignore , #PB_Ignore , GetGadgetItemAttribute(2 ,  - 1 , #PB_ListIcon_ColumnWidth , 1) - GetGadgetItemAttribute(2 ,  - 1 , #PB_ListIcon_ColumnWidth , 0) - GetSystemMetrics_(#SM_CXVSCROLL) , #PB_Ignore)
            OpenGadgetList(5)
              ScrollBarGadget(6 , 300 - GetSystemMetrics_(#SM_CXVSCROLL) - GetSystemMetrics_(#SM_CYEDGE) , GetHeaderHeight(2) , GetSystemMetrics_(#SM_CXVSCROLL) , GadgetHeight(5) - GetHeaderHeight(2) - GetSystemMetrics_(#SM_CYEDGE) , 0 ,  100 ,  50 ,  #PB_ScrollBar_Vertical)
            CloseGadgetList()
            SetWindowLong_(GadgetID(1) , #GWL_STYLE , GetWindowLong_(GadgetID(1) ,  #GWL_STYLE) & ~#WS_HSCROLL & ~#WS_VSCROLL)
            SetWindowPos_(GadgetID(1) , 0 , 0 , 0 , 0 , 0 , #SWP_NOMOVE | #SWP_NOSIZE | #SWP_NOZORDER | #SWP_FRAMECHANGED)
          Else
            ResizeGadget(8 , #PB_Ignore , #PB_Ignore , GetGadgetItemAttribute(2 ,  - 1 , #PB_ListIcon_ColumnWidth , 1) - GetGadgetItemAttribute(2 ,  - 1 , #PB_ListIcon_ColumnWidth , 0) , #PB_Ignore)
            FreeGadget(6)
          EndIf
        ElseIf EventGadget() = 100
          TreeListGadget_AddItem( - 1 , "Berlin" , "" , 0 , 0 , 0)
          TreeListGadget_AddItem( - 1 , "Charlottenburg" , "Peter" , 0 , 0 , 1)
          TreeListGadget_AddItem( - 1 , "Kreuzberg" , "Levent" , 0 , 0 , 1)
          TreeListGadget_AddItem( - 1 , "Neukölln" , "Tobias" , 0 , 0 , 1)
          TreeListGadget_AddItem( - 1 , "Tiergarten" , "Erkan" , 0 , 0 , 1)
        ElseIf EventGadget() = 101
          TreeListGadget_DeleteItem(0)
      EndIf
    EndIf
   Until Event  =  #PB_Event_CloseWindow
 EndIf
