Listview problem

  • Ja ich sitze grad an nem listview der Spieler auflistet.

    Jetz hab ich da ein problem und zwar suche ich ne möglichkeit abzufangen ob der User mit der rechten oder der linken mauste auf das view klickt,
    und welcher eintrag markiert ist bzw angeklickt wurde.

    MFG Matthias

    3 Mal editiert, zuletzt von Matthias_199 (6. Juli 2011 um 23:39)

    • Offizieller Beitrag

    Mit:

    [autoit]

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    [/autoit]


    und Auswerten von $NM_CLICK bzw. $NM_RCLICK.
    Verwende die Styles: BitOR($LVS_EX_TRACKSELECT, $LVS_EX_FULLROWSELECT), damit auch bei Rechtsklick das Item unter der Maus selektiert ist.
    Den Index der Zeile bekommst du mit: _GUICtrlListView_GetSelectedIndices und den Inhalt mit: _GUICtrlListView_GetItemText.
    Um die Werte angeklickter SubItem direkt abzufragen brauchst du zum Zeilenindex noch den Spaltenindex: _GUICtrlListView_GetSelectedColumn.

  • Okey geht das auch im Event mode?

    Hab vergessen zu sagen das ich den benutze^^

    EDIT:
    JA und splate ist nicht nötig.
    Den das ist ja ein spieler der da steht.
    Ich will das so machen wenn du links drauf klickst kommt nocmal ne GUI mit allen infos.
    Und wenn du rechts klicks kommen halt optionen wie bann kick etc^^ nix besonders

    Einmal editiert, zuletzt von Matthias_199 (21. Juni 2011 um 15:26)

  • Halo matthias_199,

    natürlich funktioniert

    [autoit]

    GuiRegisterMsg

    [/autoit]

    auch im OnEvent-Modus:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    Local $tZeit, $s1, $s2

    [/autoit] [autoit][/autoit] [autoit]

    $main = GUICreate("Test LV GuiRegisterMsg", 600, 400)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_myExit")
    $listview = GUICtrlCreateListView("Gruppe1| BlubText", 10, 10, 580, 380, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE) ; legt fest, dass Hintergrundfarbe wechselt
    GUICtrlSetBkColor(-1, 0xE6E6FA) ; Hintergrundfarbe 1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 29
    $listitem = GUICtrlCreateListViewItem("test" & $i & " |Blub " & Random(1, 9), $listview)
    GUICtrlSetBkColor(-1, 0xcccccc) ; Hintergrundfarbe 2
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ;<=========================================== Bemachrichtigung Doppelklick
    GUISetState()
    While 1
    Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _myExit()
    Exit
    EndFunc ;==>_myExit

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_NOTIFY($hWnd, $MsgID, $wParam, $lParam)
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $listview Then
    ;ConsoleWrite($code & @CRLF)
    Switch $code
    Case $NM_CLICK ;Klick
    $aItem = _GUICtrlListView_GetItemTextArray($listview)
    MsgBox(0, "Klick auf ", $aItem[1] & @CRLF & @CRLF & $aItem[2])
    Case $NM_RCLICK ;Rechtsklick

    [/autoit] [autoit][/autoit] [autoit]

    $aItem = _GUICtrlListView_GetItemTextArray($listview)
    MsgBox(0, "Rechts-Klick auf ", $aItem[1] & @CRLF & @CRLF & $aItem[2])

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    mfg autoBert

  • Okey super danke ich werds so umsetzen.
    GUIs sind halt nicht so mein Fall^^

  • okey das ist zwar leichenschändung aber was neues aufmachen :D nö^^

    Grad beim umsetzen fällt mir auf scheiße^^
    ICh hab insgesammt 4 listviews das heißt ich weiß nicht welche gerade angeklcikt wird?
    Weil

    [autoit]

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    [/autoit]


    reagiert ja immer wenn was gklickt wird auf der GUI aber er weiß ja selber net genau was ^^

    • Offizieller Beitrag

    In die Notify Func folgendes einfügen :

    [autoit]

    Local $hWndFrom = HWnd(DllStructGetData( $tagNMHDR,1))

    [/autoit]


    Einfah eine Swichabrage einfügen:

    [autoit]

    Switch $hWndFrom
    Case GUICtrlGetHandle($listview1)
    ...

    [/autoit]
  • Alles klar ich baus mal um.
    Geht das aber so wirklich und vorallem gilt das doch nur für doppelklick fällt mir gerade auch und ich tu ja nur ein mal klciken oder net?

    • Offizieller Beitrag

    Was für eine Frage. Sicher geht das, sonst hätte ich es dir bestimmt nicht geschrieben.
    Wenn du einen Doppelklick abfangen willst dafür ist die Message $NM_DBLCLK zuständig. Einfach in den Switch $Code Zweig einbauen.

    Am besten schaust du dir das Beispiel von _GUICtrlListview_Create an, da kannst du alle Messages sehen und auch austesten wann sie gefeuert werden.

  • Okey ich habs jetz halt etwas anders gelöst aber danke für die hilfe und die ansätze hier wäre ich so auch net drauf gekommen

    THX!