Wenn Maus über Bild Rahmen erstellen

  • Hallo liebe AutoIt Freunde,

    stehe vor einem Problem das meines Erachtens nicht so schwierig sein dürfte jedoch komme ich zu keiner Lösung.

    Mein Script sieht in etwa so aus:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEX.au3>

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

    $Login = GUICreate("", 810, 400)

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

    $label = GUICtrlCreateLabel("", 20, 20, 100, 20)
    $player1 = GUICtrlCreatePic("bild 1.jpg", 20, 80, 250, 250)
    $player2 = GUICtrlCreatePic("bild 2.jpg", 280, 80, 250, 250)
    $player3 = GUICtrlCreatePic("bild 3.jpg", 540, 80, 250, 250)

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

    GUISetState()

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

    $Button = 0

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

    While 1
    $Maus_pos = GUIGetCursorInfo()
    Select
    Case $Maus_pos[4] = $player1 And $Button <> 1
    GUICtrlSetData($label, "rot")
    $Button = 1
    Case $Maus_pos[4] = $player2 And $Button <> 2
    GUICtrlSetData($label, "blau")
    $Button = 2
    Case $Maus_pos[4] = $player3 And $Button <> 3
    GUICtrlSetData($label, "grün")
    $Button = 3
    Case GUIGetMsg() = -3
    Exit
    EndSelect
    WEnd

    [/autoit]

    Bilder müsst ihr zum testen haben, da da Script ja sonst nicht funktioniert. Beispielbilder findet ihr im Anhang.

    Was möchte ich nun machen?
    Ich möchte, wenn die Maus über dem Bild ist nicht, dass das Label etwas anzeigt (dies diehnte nur zum testen) sondern das das bild einen rahmen bekommt. so das man sieht das man mit der Maus gerade auf dem zB ersten Bild ist.
    Wie löse ich das am besten?

    vielen dank schon mal
    Grüße Inferior

  • danke Greenhorn, hört sich interessant an. jedoch "verschwindet" bei mir das bild das ich so modifiziert habe dann komplett O.o
    was mache ich falsch?

  • probier das doch mal mit meinem beispiel
    hab da jetzt lange rumprobiert es ist immer das gleiche das bild verschwindet komplett

  • Ja, so scheint es nicht zu funktionieren.

    Hier ein schmutziger Workaround:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEX.au3>
    #include <WinAPI.au3>

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

    $Login = GUICreate("", 810, 400)

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

    $label = GUICtrlCreateLabel("", 20, 20, 100, 20)
    $player1 = GUICtrlCreatePic("Res\bild 1.jpg", 20, 80, 250, 250)
    $player2 = GUICtrlCreatePic("Res\bild 2.jpg", 280, 80, 250, 250)
    $player3 = GUICtrlCreatePic("Res\bild 3.jpg", 540, 80, 250, 250)

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

    GUISetState()

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

    $Button = 0

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

    While 1
    $Maus_pos = GUIGetCursorInfo()
    Select
    Case $Maus_pos[4] = $player1 And $Button <> 1
    GUICtrlSetData($label, "rot")
    DrawFrame ($player1)
    $Button = 1
    Case $Maus_pos[4] = $player2 And $Button <> 2
    GUICtrlSetData($label, "blau")
    DrawFrame ($player2)
    $Button = 2
    Case $Maus_pos[4] = $player3 And $Button <> 3
    GUICtrlSetData($label, "grün")
    DrawFrame ($player3)
    $Button = 3
    Case GUIGetMsg() = -3
    Exit
    Case Else
    Switch ($Button)
    Case 1
    If ($Maus_pos[4] <> $player1) Then
    DeleteFrame ($player1)
    $Button = 0
    EndIf
    Case 2
    If ($Maus_pos[4] <> $player2) Then
    DeleteFrame ($player2)
    $Button = 0
    EndIf
    Case 3
    If ($Maus_pos[4] <> $player3) Then
    DeleteFrame ($player3)
    $Button = 0
    EndIf
    EndSwitch

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

    EndSelect
    WEnd

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

    Func DrawFrame ($idCtrl)

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

    Local $hwnd
    Local $hdc
    Local $rcClient
    Local $rcDraw
    Local $hbr

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

    $hwnd = GUICtrlGetHandle ($idCtrl)

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

    $hbr = _WinAPI_GetStockObject ($BLACK_BRUSH)
    $hdc = _WinAPI_GetDC ($hwnd)
    $rcClient = _WinAPI_GetClientRect ($hwnd)

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

    $rcDraw = DllStructCreate ("LONG;LONG;LONG;LONG")

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

    DllStructSetData ($rcDraw, 3, 3)
    DllStructSetData ($rcDraw, 4, DllStructGetData ($rcClient, 4))
    _WinAPI_FillRect ($hdc, $rcDraw, $hbr)

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

    DllStructSetData ($rcDraw, 3, DllStructGetData ($rcClient, 3))
    DllStructSetData ($rcDraw, 4, 3)
    _WinAPI_FillRect ($hdc, $rcDraw, $hbr)

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

    DllStructSetData ($rcDraw, 1, DllStructGetData ($rcClient, 3) - 3)
    DllStructSetData ($rcDraw, 4, DllStructGetData ($rcClient, 4))
    _WinAPI_FillRect ($hdc, $rcDraw, $hbr)

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

    DllStructSetData ($rcDraw, 1, 0)
    DllStructSetData ($rcDraw, 2, DllStructGetData ($rcClient, 4) - 3)
    _WinAPI_FillRect ($hdc, $rcDraw, $hbr)

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

    _WinAPI_ReleaseDC ($hwnd, $hdc)

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

    Return

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

    EndFunc

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

    Func DeleteFrame ($idCtrl)

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

    _WinAPI_InvalidateRect (GUICtrlGetHandle ($idCtrl))
    Return

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

    EndFunc

    [/autoit]


    Gruß
    Greenhorn


  • langes script für sowas aber vielen dank schon mal für deine mühe
    leider hängt sich bei mir autoIt auf bevor es das script startet
    autoit3.exe muss geschlossen werden.. scheint wohl irgendwas komisch zu sein O.o

    3 Mal editiert, zuletzt von Inferior (9. April 2012 um 22:51)

  • so weiß nun warum es bei mir gecrashed ist. hatte nicht die neuste autoIt version (schon lange nichts mehr gecoded)
    also
    an sich funktioniert das von dir Greenhorn jedoch bleibt der rahmen ab
    und an obwohl die maus schon nicht mehr auf dem bild ist
    meistens dann wenn man schnell mit der maus auf ein anderes bild umschwenkt... weiß leider nicht woran das liegen könnte
    jemand eine idee wie das zuverlässiger funktioniert?

  • AutoIt ist ziemlich lahm, aber so ist es schon etwas besser:

    Spoiler anzeigen
    [autoit]

    While 1
    $Maus_pos = GUIGetCursorInfo()
    Switch ($Button)
    Case 1
    If ($Maus_pos[4] <> $player1) Then
    DeleteFrame ($player1)
    $Button = 0
    EndIf
    Case 2
    If ($Maus_pos[4] <> $player2) Then
    DeleteFrame ($player2)
    $Button = 0
    EndIf
    Case 3
    If ($Maus_pos[4] <> $player3) Then
    DeleteFrame ($player3)
    $Button = 0
    EndIf
    EndSwitch

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

    Select
    Case $Maus_pos[4] = $player1 And $Button <> 1
    GUICtrlSetData($label, "rot")
    DrawFrame ($player1)
    $Button = 1
    Case $Maus_pos[4] = $player2 And $Button <> 2
    GUICtrlSetData($label, "blau")
    DrawFrame ($player2)
    $Button = 2
    Case $Maus_pos[4] = $player3 And $Button <> 3
    GUICtrlSetData($label, "grün")
    DrawFrame ($player3)
    $Button = 3
    Case GUIGetMsg() = -3
    Exit

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

    EndSelect
    WEnd

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

    ; ...

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

    Func DeleteFrame ($idCtrl)

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

    _WinAPI_InvalidateRect (GUICtrlGetHandle ($idCtrl))
    _WinAPI_UpdateWindow (GUICtrlGetHandle ($idCtrl))
    Return

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

    EndFunc

    [/autoit]