WM_NOTIFY funktioniert nicht richtig

  • Hallo,

    irgendwie will meine WM_NOTIFY Func nicht klappen. Sie reagiert nur bei Buttons. Ich habe aber bei meinen Listboxen $LBS_NOTIFY drin.
    Und dort bekomme ich nix von.

    Spoiler anzeigen
    [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListPPO, $hWndListUsedPPO

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

    If Not IsHWnd($cListPPO) Then $hWndListPPO = GUICtrlGetHandle($cListPPO)
    If Not IsHWnd($cListUsedPPO) Then $hWndListUsedPPO = GUICtrlGetHandle($cListUsedPPO)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    ConsoleWrite($iCode)
    Switch $hWndFrom
    Case $cListPPO, $hWndListPPO
    Switch $iCode
    Case $NM_CLICK
    ConsoleWrite("links" & @CRLF)
    EndSwitch
    Case $cListUsedPPO, $hWndListUsedPPO
    Switch $iCode
    Case $NM_CLICK
    ConsoleWrite("rechts" & @CRLF)
    EndSwitch
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]
    • Offizieller Beitrag

    Für die Listbox mußt du WM_COMMAND auswerten, Doppelklick=LBN_DBLCLICK
    (s. Bsp. in der Hilfe zu

    [autoit]

    _GUICtrlListBox_Create

    [/autoit]

    )
    Einfacher Klick wird nicht direkt als Nachricht ausgegeben, da mußt du den Umweg gehen über über das Parent-Handle (im Normalfall dein GUI-Handle) und dort abfragen:
    WM_PARENTNOTIFY
    mit LOWORD(wParam) = WM_LBUTTONDOWN

  • Danke ich mach es doch jetzt lieber mit einem Listview und mach es so, dass es aussieht wie eine Listbox. Nur ich bekomme beim Listview keinen vertikalen Scrollbalken der am Anfang ausgegraut ist.

    • Offizieller Beitrag

    Ich zeig dir trotzdem mal, wie du das nutzt - ist ganz simpel:

    Spoiler anzeigen
    [autoit]

    #include <GuiListBox.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Constants.au3>
    #include <WinAPI.au3>
    #include <StructureConstants.au3>

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

    $hGui = GUICreate('Test')
    $cListBox = GUICtrlCreateList('', 10, 10, 300, 150)
    $hListBox = GUICtrlGetHandle($cListbox)
    $cEdit = GUICtrlCreateEdit('', 10, 180, 300, 150)
    GUICtrlSetData($cListBox, 'Zeile1|Zeile2|Zeile3|Zeile4')

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

    ; == Da WM_NOTIFY ausser dem Event nur die Mausposition als Info bereitstellt, muss bei mehreren Controls geprüft werden,
    ; == ob die Maus gerade über dem Control ist. Dazu werden die (relativen) Controlpositionen in einem RECT gespeichert.
    $tList = DllStructCreate($tagRECT)
    $tEdit = DllStructCreate($tagRECT)
    _WinAPI_SetRect($tList, 10, 10, 310, 160)
    _WinAPI_SetRect($tEdit, 10, 180, 310, 330)
    Global $aID[2][2] = [[$cListBox,$tList],[$cEdit,$tEdit]]

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

    GUISetState()

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

    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
    GUIRegisterMsg($WM_PARENTNOTIFY, 'WM_PARENTNOTIFY')

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

    Do
    Until GUIGetMsg() = -3

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Switch $ilParam
    Case $hListBox
    Switch BitShift($iwParam, 16)
    Case $LBN_DBLCLK
    ConsoleWrite('Double-Click' & @CRLF)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    Func WM_PARENTNOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Switch $hWnd
    Case $hGui
    Local $iX = BitAND($ilParam, 0xFFFF)
    Local $iY = BitShift($ilParam, 16)
    Local $sControl = _ClickedControl($iX, $iY)
    Switch BitAND($iwParam, 0xFFFF)
    Case $WM_LBUTTONDOWN
    ConsoleWrite('Left-Down, X,Y: ' & $iX & ',' & $iY & @TAB & @TAB & 'on ' & $sControl & '-Control' & @CRLF)
    Case $WM_RBUTTONDOWN
    ConsoleWrite('Right-Down, X,Y: ' & $iX & ',' & $iY & @TAB & @TAB & 'on ' & $sControl & '-Control' & @CRLF)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PARENTNOTIFY

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

    Func _ClickedControl($_iX, $iY)
    Local $cCtrl
    For $i = 0 To UBound($aID) -1
    If _WinAPI_CoordInRect($aID[$i][1], $_iX, $iY) Then
    $cCtrl = $aID[$i][0]
    ExitLoop
    EndIf
    Next
    Switch $cCtrl
    Case $cListBox
    Return 'ListBox'
    Case $cEdit
    Return 'Edit'
    EndSwitch
    EndFunc

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

    ;===============================================================================
    ; Function Name: _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
    ; Description: Befüllt eine RECT-Struktur in einem Aufruf mit Werten
    ; Parameter(s): $tRECT RECT-Struktur
    ; $X1, $Y1, $X2, $Y2 Werte des Rectangle (left, top, right, bottom)
    ; Return Value(s): Erfolg <> 0
    ; Fehler 0 set @error 1-keine Struktur übergeben
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
    If Not IsDllStruct($tRECT) Then Return SetError(1,0,0)
    Local $ret = DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($tRECT), 'long', $X1, 'long', $Y1, 'long', $X2, 'long', $Y2)
    If @error > 0 Then Return SetError(1,@error,0)
    Return $ret[0]
    EndFunc ;==>_WinAPI_SetRect

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

    ;===============================================================================
    ; Function Name: _WinAPI_CoordInRect(ByRef $tRECT, $X, $Y)
    ; Description: Ermittelt ob eine übergebene Koordinate innerhalb einer RECT-Struktur ist
    ; Analog zu _WinAPI_PtInRect, aber statt $tagPOINT werden Einzelkoordinaten übergeben
    ; Parameter(s): $tRECT RECT-Struktur
    ; $X X-Koordinate
    ; $Y Y-Koordinate
    ; Return Value(s): Erfolg True/False Punkt in/nicht in RECT
    ; Fehler 0 set @error 1-keine Struktur übergeben
    ; 2-Dll-Fehler (s. @extended)
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _WinAPI_CoordInRect(ByRef $tRECT, $X, $Y)
    If Not IsDllStruct($tRECT) Then Return SetError(1,0,0)
    Local $ret = DllCall("user32", "long", "PtInRect", "ptr", DllStructGetPtr($tRECT), "long", $X, "long", $Y)
    If @error > 0 Then Return SetError(2,@error,0)
    If $ret[0] Then Return True
    Return False
    EndFunc ;==>_WinAPI_CoordInRect

    [/autoit]


    Edit: Ich habe das Bsp. mal erweitert, um zu zeigen, wie du bei mehreren Controls vorgehst.

  • Danke BugFix aber ich nehme doch lieber Listview. Das mit dem vertikalen Scrollbalken ist mir auch egal. Aber ich will den horizontalen weghaben. Weißt du wie das geht?