Win-API-Lib: Problem ListIconGadget

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Win-API-Lib: Problem ListIconGadget

Beitrag von ProgOldie »

Hallo,
in der Win-Api-Library gibt es für das ListIconGadget ein an sich sehr schönes Beispiel für das Bearbeiten eines Items:
http://www.rsbasic.de/aktualisierung/wi ... rbeiten.pb

Code: Alles auswählen

;Autor: Fluid Byte 

EnableExplicit

Define EventID
Define a
Global lpPrevFunc

#Gadget_LIG = 1

Procedure EditLabelProc(hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_WINDOWPOSCHANGING
      Protected *lpwp.WINDOWPOS = lParam
      
      ;Nun wird die Breite der Spalte 0 ermittelt  **********************
      *lpwp\x = GetGadgetItemAttribute(#Gadget_LIG, 0, #PB_ListIcon_ColumnWidth) + 4
      
      ProcedureReturn 0
  EndSelect
  
  ProcedureReturn CallWindowProc_(lpPrevFunc, hWnd, uMsg, wParam, lParam)
EndProcedure

Procedure WindowCallback(hWnd, uMsg, wParam, lParam)
  Protected *nmh.NMHDR
  Protected *nmpdi.NMLVDISPINFO
  
  Select uMsg
    Case #WM_NOTIFY
      *nmh.NMHDR = lParam
      
      If *nmh\hwndFrom = GadgetID(#Gadget_LIG)
        Select *nmh\code
          Case #LVN_BEGINLABELEDIT
            Protected hwndLVEdit = SendMessage_(*nmh\hwndFrom, #LVM_GETEDITCONTROL, 0, 0)
            ;die folgende Spalte gilt leider nur für Spalte 1 **********************
            Protected Result$ = GetGadgetItemText(#Gadget_LIG, GetGadgetState(#Gadget_LIG), 1) 
            
            SendMessage_(hwndLVEdit, #WM_SETTEXT, 0, @Result$)
            
            lpPrevFunc = SetWindowLong_(hwndLVEdit, #GWL_WNDPROC, @EditLabelProc())
            
            ProcedureReturn 0
            
          Case #LVN_ENDLABELEDIT
            *nmpdi.NMLVDISPINFO = lParam
            
            If *nmpdi\item\pszText  ; die folgende Zeile leider nur für Spalte 1 *************
              SetGadgetItemText(#Gadget_LIG, GetGadgetState(#Gadget_LIG), PeekS(*nmpdi\item\pszText), 1) 
            EndIf
            
            ProcedureReturn 0
        EndSelect
      EndIf
      
      ProcedureReturn 0   
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(#Gadget_LIG, 0, 0, WindowWidth(0), WindowHeight(0), "Spalte 1", 150, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #LVS_EDITLABELS)
  AddGadgetColumn(#Gadget_LIG, 1, "Spalte 2", 150)
  AddGadgetColumn(#Gadget_LIG, 2, "Spalte 3", 150)
  
  For a=1 To 10
    AddGadgetItem(#Gadget_LIG, -1, "Item " + Str(a) + ", 1" + Chr(10) + "Item " + Str(a) + ", 2" + Chr(10) + "Item " + Str(a) + ", 3", 0, 0)
  Next
  
  SetWindowCallback(@WindowCallback())
  
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Leider kann man damit nur Spalte 1 in der jeweils angeklickten Zeile editieren. Dazu habe ich an einigen Stellen mit *** Hinweise eingefügt. Das schließt auch die Bestimmung der Spaltenbreite von Spalte 0 ein.

Es wäre schön, wenn man das Ganze so erweitern könnte, dass die jeweils angeklickte Zeile und Spalte editiert werden könnte. (Leider verstehe ich viel zu wenig von den API-Funktionen.)
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18