Rechtsklick auf Control feststellen (speziell)

  • Hi.
    Etwas, was schon mehrfach gefragt wurde. Wie stelle ich einen Rechtsklick auf ein bestimmtes Control fest? Ich kenne 2 Methoden durch GUIRegisterMsg, die beide nicht funktionieren.

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    $hGUI = GUICreate("Bild", 360, 640)
    $hPic = GUICtrlCreatePic("", 0, 0, 360, 640)

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

    _GDIPlus_Startup()

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

    $hBitmap = _GDIPlus_ImageLoadFromFile("light.jpg")
    $hNewBitmapHandle = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    SetBitmapToCtrl($hPic, $hNewBitmapHandle)

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

    GUISetState()

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

    GUIRegisterMsg(0x004E, "MyUserFunction") ;0x004E = $WM_NOTIFY

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

    While 1
    Sleep(50)

    If GUIGetMsg() = -3 Then Exit
    WEnd

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

    Func MyUserFunction($hWnd, $vMsgID, $vWParam, $vLParam)
    ;geht nicht
    If $vWParam = $hPic Then
    $vTagNMHDR = DllStructCreate("int;int;int", $vLParam)
    $vEvent = DllStructGetData($vTagNMHDR, 3)
    If $vEvent = -5 Then ;-5 = $NM_RCLICK
    MsgBox(0,"","Rechtsklick auf Bild")
    EndIf
    EndIf

    ;geht auch nicht
    Local $hGUIFrom, $iCode, $tNMHDR ;$iIDFrom
    $tNMHDR = DllStructCreate($tagNMHDR, $vLParam)
    $hGUIFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))

    If $hGUIFrom = $hPic Then
    ;$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    If $iCode = 0x700 Then
    Local $tMsgFilter = DllStructCreate("int;int;int;uint msg;int wParam;int lParam", $vLParam)
    If DllStructGetData($tMsgFilter, 4) = 0x205 Then ; WM_RBUTTONUP
    MsgBox(0,"","Rechtsklick auf Bild")
    EndIf
    EndIf
    EndIf

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

    Return 'GUI_RUNDEFMSG'
    EndFunc ;==>_SM_NotifyActions

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

    ;Set a bitmap to a control - by Zedna
    Func SetBitmapToCtrl($vCtrlID, $h_Bitmap)
    Local $hWnd = GUICtrlGetHandle($vCtrlID)
    If $hWnd = 0 Then Return SetError(1, 0, 0)

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

    Local $vOldStyle = _WinAPI_GetWindowLong($hWnd, -16)
    _WinAPI_SetWindowLong($hWnd, -16, BitOR($vOldStyle, 0xE))

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

    Local $vOldBmp = _SendMessage($hWnd, 0x0172, 0, $h_Bitmap)
    If $vOldBmp <> 0 Then _WinAPI_DeleteObject($vOldBmp)
    EndFunc ;==>_SM_SetBitmapToCtrl

    [/autoit]


    Das es nicht geht liegt an der Funktion SetBitmapToCtrl. Ich brauche also eine Alternative. Habe schon ein paar Threads durchgeguckt aber nur auf die 2 Methoden gestoßen, oder halt durch Mousepos und IsPressed und so, was ich aber nicht möchte.

    Warum ich das Bild so lade spielt keine Rolle, das lässt sich nicht ändern.

    Kennt noch jemand eine Methode?

    Edit: Hier noch das Bild:
    [Blockierte Grafik: http://img3.imagebanana.com/img/lq4g01k0/light.jpg]

    Einmal editiert, zuletzt von NoName (5. Oktober 2010 um 16:15)

  • Schau dir folgendes Beispiel an:
    (Beispielbild 'Test.bmp' muss ggf. umbenannt werden!)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    Global $Rect[4]
    $Rect[0] = 24
    $Rect[1] = 16
    $Rect[2] = 169+$Rect[0]
    $Rect[3] = 129+$Rect[1]
    $Form1 = GUICreate("Form1", 294, 213, 192, 124)
    $Pic1 = GUICtrlCreatePic("test.bmp", 24, 16, 169, 129, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_SECONDARYDOWN
    WinSetTitle($Form1,"","Rechtsklick <DOWN>")
    Case $GUI_EVENT_SECONDARYUP
    WinSetTitle($Form1,"","Rechtsklick <UP>")
    $a=GUIGetCursorInfo()
    If $a[0] >= $Rect[0] And $a[0] <= $Rect[2] And $a[1] >= $Rect[1] And $a[1] <= $Rect[3] Then
    MsgBox(0,"Funktion","Bild wurde mit Rechtsklick angeklickt!")
    EndIf

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

    EndSwitch
    WEnd

    [/autoit]


    Mit GuiSetOnEvent sollte es übrigens auch klappen!
    PS: Die Koordinaten müssen selbstverständlich auch angepasst werden :rolleyes:

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Die Koordinaten braucht man eigentlich nicht:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    $hGUI = GUICreate("Bild", 380, 380)
    $idLabel = GUICtrlCreateLabel("", 20, 0, 340, 20, $SS_CENTER + $SS_CENTERIMAGE)
    $idPic = GUICtrlCreatePic("", 20, 20, 340, 340, $SS_SUNKEN)
    GUISetState()

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

    $Control = 0

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

    While True
    Switch Guigetmsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $GUI_EVENT_SECONDARYDOWN
    $aCursor = GUIGetCursorInfo($hGUI)
    GUICtrlSetData($idLabel, "Rechte Maustaste ist gedrückt!")
    $Control = $aCursor[4]
    Case $GUI_EVENT_SECONDARYUP
    $aCursor = GUIGetCursorInfo($hGUI)
    GUICtrlSetData($idLabel, "")
    If $aCursor[4] = $idPic And $aCursor[4] = $Control Then
    MsgBox(0, "Achtung!", "Rechtsklick auf dem Bild!")
    EndIf
    $Control = 0
    EndSwitch
    WEnd

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

    Exit

    [/autoit]
  • Hi danke schonmal. Wollte eigentlich aber nicht mit Curser- bzw. Mousepos arbeiten. Sonst hätte ich mein Problem schon gelöst ;)

    Edit: @Großvater: Danke, das ist glaub ich die Methode, die ich benutzt hatte! Mal schnell probieren.