Forum | | | | - Seite 1 - |
| Andreas Koch | Hallo zusammen,
ich stehe schon wieder einmal vor einem Problem. Es geht darum, angezeigt zu bekommen, über welchem Listviewitem (Spalte, Zeile) sich der Mauszeiger gerade befindet. Mein Gedanke ist, im Anschluss an einen simulierten Mausklick Getcontrolparas abzufragen und das Ganze in eine Schleife einzubauen. Hat jemand eine Idee, wie man das machen könnte oder hat es sogar gemacht? Ich habe versucht mit mouse_event zu arbeiten, aber das funktioniert nicht.
Schönen Gruß
Andreas Koch |
| | | | |
| | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | Thomas Freier | Das hatten wir doch, ich glaube beim Stundenplan. Hier ein min. Beispiel für Tooltip:
$H Windows.ph
$H commctrl.ph
Struct LVHitTestInfo = X&,Y&,flags&,Item&,SubItem&
Declare LVHTI#,LView&,l%
Dim LVHTI#,LVHitTestInfo
Proc LV_HitTest
Parameters LV&,X%,Y%
~GetCursorPos(LVHTI#)
~ScreenToClient(LV&,LVHTI#)
SendMessage(LV&,~LVM_SUBITEMHITTEST,0,LVHTI#)
Return LVHTI#.SubItem&
EndProc
Cls
LView& = Create("GridBox",%hwnd,"Test 0;0;100;Test 1;0;100;Test 2;0;100;Bemerkung;0;100",0,20,10,410,200)
WhileLoop 0,4
AddString(LView&,"0 Test " + Str$(&Loop) + "|1 Test " + Str$(&Loop) + "|2 Test " + Str$(&Loop) + "|")
Wend
var text$="Was ist denn überhaupt ein Listview? \nOb sie's glauben oder nicht. "+ \
"Sobald sie ihren Windows-PC anschalten, erscheint schon das erste Listview."+ \
"Wo, fragen sie? Auf ihrem Bildschirm.\nDer Windows Bildschirm ist nämlich nichts anderes als ein Listview.\n"+ \
"(FRABBING)"
SetText LView&, 1, 3, text$
sendmessage(Lview&,~LVM_SETEXTENDEDLISTVIEWSTYLE,0,~LVM_SUBITEMHITTEST)'markiert die Zeile unter der Maus
'sendmessage(LView&,0,~LVM_SETHOVERTIME,10) 'löst praktisch ein Mausklick aus ????
var ToolTip&=create("Tooltip",%hwnd,LView&,"")
var medit%=Create("MultiEdit",%hwnd,"",0,0,300,-400)
ShowWindow(medit%,0)
While 1
WaitInput 100
l% = LV_HitTest(LView&,%mousex,%mousey)
'
SELECT LVHTI#.Item&
CASEOF 1'ZEILE
If LVHTI#.SubItem&=3'ITEM
SetText medit%,GetText$(LView&,LVHTI#.Item&,LVHTI#.SubItem&)
text$=""
Whileloop GetLineCount(medit%)'Anzahl Zeilen
text$=text$+GetLine$(medit%,&loop-1)+"\n"'einzelne Zeilen auslesen und Zeilenumbruch
Wend
settext ToolTip&,%hwnd,LView&,text$
EndIf
CASEOF 3'ZEILE
settext ToolTip&,%hwnd,LView&,"erste Wahl"
OTHERWISE
settext ToolTip&,%hwnd,LView&,""
ENDSELECT
Wend
end
Müßte sicher auf SubClassProc umgestellt werden. |
| | | | | |
| | | Wissen tue ich es nicht, aber die Breiten der Spalten kann man imho mit LVM_GETCOLUMNWIDTH ermitteln, per minus Mausposition-X dürfte man so die Spalte herausbekommen.
Es gibt aber auch LVM_GETITEMINDEXRECT ( [...] ) was vielleicht noch hilfreicher ist.
Mausklick vlt. einfach so:
|
| | | | |
| | Thomas Freier | Das hatten wir doch, ich glaube beim Stundenplan. Hier ein min. Beispiel für Tooltip:
$H Windows.ph
$H commctrl.ph
Struct LVHitTestInfo = X&,Y&,flags&,Item&,SubItem&
Declare LVHTI#,LView&,l%
Dim LVHTI#,LVHitTestInfo
Proc LV_HitTest
Parameters LV&,X%,Y%
~GetCursorPos(LVHTI#)
~ScreenToClient(LV&,LVHTI#)
SendMessage(LV&,~LVM_SUBITEMHITTEST,0,LVHTI#)
Return LVHTI#.SubItem&
EndProc
Cls
LView& = Create("GridBox",%hwnd,"Test 0;0;100;Test 1;0;100;Test 2;0;100;Bemerkung;0;100",0,20,10,410,200)
WhileLoop 0,4
AddString(LView&,"0 Test " + Str$(&Loop) + "|1 Test " + Str$(&Loop) + "|2 Test " + Str$(&Loop) + "|")
Wend
var text$="Was ist denn überhaupt ein Listview? \nOb sie's glauben oder nicht. "+ \
"Sobald sie ihren Windows-PC anschalten, erscheint schon das erste Listview."+ \
"Wo, fragen sie? Auf ihrem Bildschirm.\nDer Windows Bildschirm ist nämlich nichts anderes als ein Listview.\n"+ \
"(FRABBING)"
SetText LView&, 1, 3, text$
sendmessage(Lview&,~LVM_SETEXTENDEDLISTVIEWSTYLE,0,~LVM_SUBITEMHITTEST)'markiert die Zeile unter der Maus
'sendmessage(LView&,0,~LVM_SETHOVERTIME,10) 'löst praktisch ein Mausklick aus ????
var ToolTip&=create("Tooltip",%hwnd,LView&,"")
var medit%=Create("MultiEdit",%hwnd,"",0,0,300,-400)
ShowWindow(medit%,0)
While 1
WaitInput 100
l% = LV_HitTest(LView&,%mousex,%mousey)
'
SELECT LVHTI#.Item&
CASEOF 1'ZEILE
If LVHTI#.SubItem&=3'ITEM
SetText medit%,GetText$(LView&,LVHTI#.Item&,LVHTI#.SubItem&)
text$=""
Whileloop GetLineCount(medit%)'Anzahl Zeilen
text$=text$+GetLine$(medit%,&loop-1)+"\n"'einzelne Zeilen auslesen und Zeilenumbruch
Wend
settext ToolTip&,%hwnd,LView&,text$
EndIf
CASEOF 3'ZEILE
settext ToolTip&,%hwnd,LView&,"erste Wahl"
OTHERWISE
settext ToolTip&,%hwnd,LView&,""
ENDSELECT
Wend
end
Müßte sicher auf SubClassProc umgestellt werden. |
| | | | |
| | Andreas Koch | Hallo ihr beiden,
ganz herzlichen Dank für eure Antworten. Ich wurschtel schon den ganzen Tag rum, aber jetzt klappts. Kurzes Feedback: Um Getcontrolparas nutzen zu können, muss man das Drücken und das Loslassen simulieren , war leider für meinen ursprünglichen Zweck nicht ganz geeignet, funktioniert aber doch mit mouse_event. Dieser Tooltip fürs Listview war schlicht genial, genau das was ich gesucht habe. Danke.
PS: Ich hatte hier mal gefragt, ob man die Listviewposition (Spalte, Zeile) des Editcontrols mit dem Handle Getvar(0) ermitteln kann. Das funktioniert auch mit der Methode: man bestimmt mit Getwindowrect Position und Abmessung des Edits und verwendet anschließend den Hittest mit dem Mittelwerten aus getwindowrect. Wenn das Ganze in einer Schleife mit der Abbruchbedingung While Getvar(0) gemacht wird, bekommt man ständig die aktuelle Position. |
| | | | |
| | | | | | | |
|
AntwortenThemenoptionen | 9.210 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |