Editierbares ListIconGadget mit Ausrichtung

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Editierbares ListIconGadget mit Ausrichtung

Beitrag von Rudi »

Hier eine Lösung mit je einer Prozedur von netmaestro und sibru, welche durch mich manipuliert wurden.

Den Code habe ich schon eine ganze Weile herumzuliegen. Vielleicht kann jemand was mit anfangen.

Hinweis: Die erste Spalte im LIG ist ausgeblendet. Änderungen werden übernommen sobald der Mauszeiger aus der Zelle bewegt wird.

Code: Alles auswählen

Enumeration
  #Win
EndEnumeration

Enumeration
  #Lig
  #Stg
EndEnumeration

Global Zeile, Spalte, oldproc

#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56

Procedure LigAusrichtGet() ;sibru
  Protected Ausricht.LV_COLUMN\mask = #LVCF_FMT
  If SendMessage_(GadgetID(#Lig), #LVM_GETCOLUMN, Spalte, @Ausricht) = 0
    Ausricht\fmt = #LVS_NOCOLUMNHEADER - 1 ;Error
  EndIf
  If Ausricht\fmt - #LVS_NOCOLUMNHEADER = 0 : Adj = #ES_LEFT
  ElseIf Ausricht\fmt - #LVS_NOCOLUMNHEADER = 1 : Adj = #ES_RIGHT
  ElseIf Ausricht\fmt - #LVS_NOCOLUMNHEADER = 2 : Adj = #ES_CENTER
  Else
    Adj = #ES_LEFT
  EndIf
  ProcedureReturn Adj
EndProcedure

Procedure SubClass_LV(hWnd, uMsg, wParam, lParam) ;netmaestro
  result = CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
  If uMsg = #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
      Zeile  = hitinfo\iItem
      Spalte = hitinfo\iSubItem
      RtlZeroMemory_(@itemrect.RECT, SizeOf(RECT))
      itemrect\top = hitinfo\iSubItem
      SendMessage_(hWnd, #LVM_GETSUBITEMRECT, hitinfo\iItem, @itemrect)
      FreeGadget(#Stg)
      StringGadget(#Stg, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, GetGadgetItemText(#Lig, Zeile, Spalte), #WS_EX_STATICEDGE | LigAusrichtGet())
      SetParent_(GadgetID(#Stg), GadgetID(#Lig))
      ResizeGadget(#Stg, itemrect\left + 6, itemrect\top, itemrect\right - itemrect\left - 11, itemrect\bottom - itemrect\top - 1)
      SetActiveGadget(#Stg)
      SendMessage_(GadgetID(#Stg), #EM_SETSEL, 0, -1)
    Else
      HideGadget(#Stg, 1)
    EndIf
  ElseIf uMsg = #WM_NOTIFY And IsWindowVisible_(GadgetID(1)) = 1
    HideGadget(#Stg, 1)
  EndIf
  ProcedureReturn result
EndProcedure

If OpenWindow(#Win, #PB_Ignore, #PB_Ignore, 350, 250, "EditListIconGadget", #PB_Window_SystemMenu)
  ListIconGadget(#Lig, 0, 0, 350, 250, "", 0, #PB_ListIcon_GridLines)
  oldproc = SetWindowLongPtr_(GadgetID(#Lig), #GWL_WNDPROC, @SubClass_LV())
  AddGadgetColumn(#Lig, 1, "GSM-Netz", 100)
  AddGadgetColumn(#Lig, 2, "UMTS-Netz", 100)
  AddGadgetColumn(#Lig, 3, "Festnetz", 115)
  AddGadgetItem(#Lig, -1, #LF$ + "HSCSD" + #LF$ + "UMTS" + #LF$ + "Modem")
  AddGadgetItem(#Lig, -1, #LF$ + "GPRS" + #LF$ + "HSPA" + #LF$ + "ISDN")
  AddGadgetItem(#Lig, -1, #LF$ + "EDGE" + #LF$ + "HSPA+" + #LF$ + "DSL")
  StringGadget(#Stg, 0, 0, 0, 0, "", #WS_EX_STATICEDGE) : HideGadget(#Stg, 1)
  align.LV_COLUMN\mask = #LVCF_FMT
  align\fmt = #LVCFMT_CENTER
  SendMessage_(GadgetID(#Lig), #LVM_SETCOLUMN, 2, @align)
  align\fmt = #LVCFMT_RIGHT
  SendMessage_(GadgetID(#Lig), #LVM_SETCOLUMN, 3, @align)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #Stg
            Select EventType()
              Case #PB_EventType_Change
                SetGadgetItemText(#Lig, Zeile, GetGadgetText(#Stg), Spalte)
            EndSelect
        EndSelect
      Case #PB_Event_CloseWindow
        Select EventWindow()
          Case #Win
            CloseWindow(#Win)
            Break
        EndSelect
    EndSelect
  ForEver
EndIf
End
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche