und da ich keine globalen Variablen benutze, auch kein EnableExplizit etc. Dafür gibt es Strukturen !
Code: Alles auswählen
Structure myListIcon
id.l
sp.l
ze.l
EndStructure
Procedure Api_LVM_MousePosition(*lv.mylisticon)
;Position des horizontalen Scrollbalken ermitteln
info.scrollinfo
info\cbSize = SizeOf(SCROLLINFO)
info\fMask = #SIF_ALL
GetScrollInfo_(*lv\id,#SB_HORZ,info.scrollinfo) ;info\nTrackPos ist kein Pixelwert
horzposi = SetScrollPos_(*lv\id,#SB_HORZ,info\nTrackPos,0) ;gibt Pixelwert zurück
;index der obersten Zeile ermitteln, dies ersetzt Abfrage vertikaler Scrollbalken
topindex = SendMessage_(*lv\id,#LVM_GETTOPINDEX,0,0)
;Höhe der Zeilen ermitteln, setzt voraus das alle gleiche Höhe haben !!!
; wenn nicht dann für itemhöhe eine Repeatschleife einbauen! ähnlich Spalte ermitteln
SendMessage_(*lv\id,#LVM_GETITEMRECT,0,r.rect)
itemhoehe = r\bottom - r\top
;Höhe des Headers ermitteln
header = SendMessage_(*lv\id, #LVM_GETHEADER, 0, 0)
#HDM_GETITEMRECT = #HDM_FIRST + 7
SendMessage_(header, #HDM_GETITEMRECT, 1, r.rect)
headerhoehe = r\bottom - r\top + 1 ;die 1 ist ein Korrekturwert um die Zeile genau zu treffen
;Größe bzw. Position vom ListIconGadget ermitteln bezogen auf Screen links oben
GetWindowRect_(*lv\id,gadget.rect)
;=====================================================
;wo bin ich bezogen auf Screen links oben
GetCursorPos_(cursorpos.point)
;ist MausCursor im Gadget ?
If PtInRect_(gadget.rect,cursorpos\x,cursorpos\y)
;x + y = Position im Gadget bezogen auf 1. sichtbare Spalte/Zeile links oben
x = cursorpos\x - gadget\left
y = cursorpos\y - gadget\top - headerhoehe
;Spalte ermitteln
If x > 0
j=0
abstand=2 ;die 2 ist ein Korrekturwert um die Spalte genau zu treffen
Repeat ;Spaltenbreiten addieren bis Mausposi erreicht
br = SendMessage_(*lv\id,#LVM_GETCOLUMNWIDTH,j,0)
If br
abstand + br
j + 1
spalte = j
Else
spalte = -1
Break
EndIf
Until x + horzposi < abstand ;hier wird horizontaler Scrollbalken berücksichtigt
EndIf
;Zeile/Index ermitteln
If y > 0 ;y kann negativ werden, wegen headerhoehe
zeile = (y / itemhoehe) + topindex + 1
EndIf
;MausCursor NICHT im Gadget
Else
zeile = -1
spalte = -1
EndIf
*lv\ze = zeile
*lv\sp = spalte
ProcedureReturn spalte
EndProcedure
;=====================================================
Enumeration
#win1
#but1
#lvg1
#lvg2
EndEnumeration
lv1.mylisticon
lv2.mylisticon
fontnr1 = FontID(LoadFont(#PB_Any, "Arial", 8))
fontnr2 = FontID(LoadFont(#PB_Any, "Arial", 12))
hwnd = OpenWindow(#win1,0,0,640,480,"ListIcon Gadget",#PB_Window_SystemMenu|1)
CreateGadgetList(hwnd)
ButtonGadget(#but1,10,420,80,25,"Tue nix")
lv1\id = ListIconGadget(#lvg1,10,12,300,400,"",0,#PB_ListIcon_GridLines)
AddGadgetColumn(#lvg1,0,"Spalte 1",150)
AddGadgetColumn(#lvg1,1,"Spalte 2",55)
AddGadgetColumn(#lvg1,2,"Spalte 3",55)
SetGadgetFont(#lvg1, fontnr1)
lv2\id = ListIconGadget(#lvg2,320,12,300,400,"",0,#PB_ListIcon_GridLines)
AddGadgetColumn(#lvg2,0,"Spalte 1",200)
AddGadgetColumn(#lvg2,1,"Spalte 2",200)
AddGadgetColumn(#lvg2,2,"Spalte 3",200)
SetGadgetFont(#lvg2, fontnr2)
For i = 1 To 62
nr$ = LSet(Str(i),3," ")
txt$ = "Text in Zeile "+nr$+" in Spalte 1"+#LF$+"Spalte 2"+#LF$+"Spalte 3"
AddGadgetItem(#lvg1, -1, txt$)
AddGadgetItem(#lvg2, -1, txt$)
Next
;=====================================================
Repeat
event = WaitWindowEvent()
If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu
welcherButton = EventGadget()
Select welcherButton
Case #but1: Debug "Button 1 gedrückt"
EndSelect
ElseIf event = #WM_MOUSEMOVE
Api_LVM_MousePosition(lv1)
If lv1\sp > -1
Debug "LV1 Spalte " + Str(lv1\sp)
Debug "LV1 Zeile " + Str(lv1\ze)
EndIf
Api_LVM_MousePosition(lv2)
If lv2\sp > -1
Debug "LV2 Spalte " + Str(lv2\sp)
Debug "LV2 Zeile " + Str(lv2\ze)
EndIf
Debug "---"
EndIf
Until event = #PB_Event_CloseWindow
End