Per Klick auf Pic Event auslösen, trotz überlappenden, korrekt dargestellten Bildern

  • Mensch, das ist eine lange Überschrift.

    Hallöchen.

    Ich programmier zur Zeit ein Kartenspiel. Die eigenen Karten werden überlappend angezeigt, einfach weil es besser aussieht.
    Wenn sie sich überlappen, dann werden sie inkorrekt angezeigt, außer natürlich, wenn ich GuiCtrlSetState(-1, $GUI_DISABLE) nutze.
    Daraufhin kann man allerdings nicht mehr auf eine Karte klicken, woraufhin diese geworfen wird (nach einigen Überprüfungen).
    Über einen Denkanstoß würde ich mich sehr freuen :)


    Edit: Mir fällt gerad ein, dass die Mausposition beim Mausklick eine Möglichkeit wäre, ist aber doch ein bisschen blöd die Lösung...

    Einmal editiert, zuletzt von lavido (14. Mai 2011 um 01:32)

  • Edit: Mir fällt gerad ein, dass die Mausposition beim Mausklick eine Möglichkeit wäre, ist aber doch ein bisschen blöd die Lösung...


    Probier mal GUIGetCursorInfo. Zurück bekommst du von dieser Funktion einen Array, in dem das 4te Element besagt, über welchem GUI Ctrl sich die Maus zur Zeit befindet.

  • Probier mal GUIGetCursorInfo. Zurück bekommst du von dieser Funktion einen Array, in dem das 4te Element besagt, über welchem GUI Ctrl sich die Maus zur Zeit befindet.

    Leider klappt dies nicht. Mir wird dabei der Wert 0 ausgegeben.

  • Hallo lavido,

    dann machst du etwas verkehrt. Hier ein Beispiel-Skript zur Demo:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Array.au3>

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

    Local $aPics[52][2]
    $k = 0
    #region - GUI Create
    GUICreate('Test', 550, 550)
    For $i = 0 To 3
    Switch $i
    Case 0
    $sFarbe = "Karo"
    Case 1
    $sFarbe = "Herz"
    Case 2
    $sFarbe = "Pik"
    Case 3
    $sFarbe = "Kreuz"
    EndSwitch
    For $j = 2 To 14
    $sKarte = $sFarbe
    Switch $j
    Case 11
    $sKarte &= " Bube"
    Case 12
    $sKarte &= " Dame"
    Case 13
    $sKarte &= " König"
    Case 14
    $sKarte &= " As"
    Case Else
    $sKarte &= " " & $j
    EndSwitch
    $aPics[$k][1] = $sKarte
    $aPics[$k][0] = GUICtrlCreatePic(@ScriptDir & "\karten\" & $sKarte & ".jpg", 10 + $i * 105, -65 + $j * 35, 71, 96)
    $k += 1
    GUICtrlSetState(-1, $GUI_DISABLE)
    Next
    Next
    GUICtrlCreateLabel("Die Maus befindet sich über der: ", 420, 10, 120, 50)
    $idLabel = GUICtrlCreateLabel("", 420, 70, 120, 50)
    GUICtrlSetFont(-1,14,1440)
    $iOld = -1

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

    GUISetState()
    #endregion - GUI Create

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

    #region - GUI SelectLoop
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    $aCursor = GUIGetCursorInfo()
    ConsoleWrite($aCursor[4] & @TAB)
    If $aCursor[4] >= $aPics[0][0] And $aCursor[4] <= $aPics[51][0] Then
    $iRes = _ArraySearch($aPics, $aCursor[4])
    If Not @error Then
    If $iRes <> $iOld Then
    GUICtrlSetData($idLabel, $aPics[$iRes][1])
    $iOld = $iRes
    EndIf
    EndIf
    Else
    GUICtrlSetData($idLabel, "")
    $iOld = -1
    EndIf
    WEnd
    #endregion - GUI SelectLoop

    [/autoit]

    autoit.de/wcf/attachment/13266/ wird auch benötigt,

    mfg autoBert

  • Das war durchaus hilfreich. Dabei ist mir dann eben auch aufgefallen, dass ich [winhandle] mit einem nicht angezeigten GUI angab. :whistling:
    So sieht das schon besser aus.

    Ich melde mich wieder wenn es klappt, oder auch nicht :)

    Vorerst danke ich euch beiden :)

  • Warum sollte es nicht funktionieren. Hier das Beispiel dahingehend abgeändert dass nach drücken der rechten Maustaste die Karte unter der Maus gelöscht wird:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Array.au3>
    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    Local $aPics[52][2]
    $k = 0
    #region - GUI Create
    GUICreate('Test', 550, 550)
    For $i = 0 To 3
    Switch $i
    Case 0
    $sFarbe = "Karo"
    Case 1
    $sFarbe = "Herz"
    Case 2
    $sFarbe = "Pik"
    Case 3
    $sFarbe = "Kreuz"
    EndSwitch
    For $j = 2 To 14
    $sKarte = $sFarbe
    Switch $j
    Case 11
    $sKarte &= " Bube"
    Case 12
    $sKarte &= " Dame"
    Case 13
    $sKarte &= " König"
    Case 14
    $sKarte &= " As"
    Case Else
    $sKarte &= " " & $j
    EndSwitch
    $aPics[$k][1] = $sKarte
    $aPics[$k][0] = GUICtrlCreatePic(@ScriptDir & "\karten\" & $sKarte & ".jpg", 10 + $i * 105, -65 + $j * 35, 71, 96)
    $k += 1
    GUICtrlSetState(-1, $GUI_DISABLE)
    Next
    Next
    GUICtrlCreateLabel("Die Maus befindet sich über der: ", 420, 10, 120, 50)
    $idLabel = GUICtrlCreateLabel("", 420, 70, 120, 50)
    GUICtrlSetFont(-1,14,1440)
    $iCard = -1

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

    GUISetState()
    #endregion - GUI Create

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

    #region - GUI SelectLoop
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    if _IsPressed("02",$dll) And $iCard <> -1 Then
    GUICtrlDelete($iCard)
    $iCard = -1
    While _IsPressed("02",$dll)
    Sleep(10)
    WEnd
    EndIf
    $aCursor = GUIGetCursorInfo()
    If $aCursor[4] >= $aPics[0][0] And $aCursor[4] <= $aPics[51][0] Then
    $iRes = _ArraySearch($aPics, $aCursor[4])
    If Not @error Then
    If $aPics[$iRes][0] <> $iCard Then
    GUICtrlSetData($idLabel, $aPics[$iRes][1])
    $iCard = $aPics[$iRes][0]
    EndIf
    EndIf
    Else
    GUICtrlSetData($idLabel, "")
    $iCard = -1
    EndIf
    WEnd
    #endregion - GUI SelectLoop

    [/autoit]

    mfg autoBert

  • Warum es nicht funktionieren sollte? Aufgrund meiner Inkompetenz. ;)
    Läuft alles super nach mehreren nervigen Fehleranalysen und Suchvorgängen.

    Ja, der Teil des Codes war mir schon klar autoBert, mir fehlte bloß die Anstoß mit den Karten.
    GuiGetCurserInfo war mir vorher unbekannt. Hat mir die Sache wesentlich vereinfacht, ich hätte sonst wahrscheinlich mit MouseGetPos genutzt.


    Danke euch beiden + [gelöst]