Deutsch
Forum

Mauszeiger im Listview Controlparas

 
- 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
 
22.05.2013  
 



« 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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
22.05.2013  
 



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.
LVM_FIRST = $1000
LVM_GETCOLUMNWIDTH = ~LVM_FIRST + 29
LVM_SETCOLUMNWIDTH = ~LVM_FIRST + 30

Proc GetColWidth

    Parameters hGBox&, ColNr%
    Declare ColWidth%
    ColWidth% = SendMessage( hGBox&, ~LVM_GetColumnWidth, ColNr%, 0)
    Return ColWidth%

EndProc


Mausklick vlt. einfach so:
Def mouse_event(5) !"USER32","mouse_event"
mouse_event(2,0,0,0,0)'linke maustaste runter
mouse_event(4,0,0,0,0)'linke maustaste wieder hoch
 
22.05.2013  
 




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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
22.05.2013  
 




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.
 
22.05.2013  
 



 
22.05.2013  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

9.233 Betrachtungen

Unbenanntvor 0 min.
Member 154727723.09.2018
Erfurt28.12.2016
Michael W.07.07.2016
Georg Teles29.06.2016
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

Andreas Koch (2x)
iF (2x)
Thomas Freier (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie