Editierbares ListIconGadget mit Ausrichtung
Verfasst: 03.10.2010 18:26
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.
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