Control Id anhand der Position ermitteln

  • Gibt es eine möglichkeit die Id eines Controls im eigenen Fenster anhand dessen Position (x,y) zu ermitteln?
    MfG

  • Spoiler anzeigen
    [autoit]

    $GUI = GUICreate("hallo", 220, 140)

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

    $Button1 = GUICtrlCreateButton("hallo1", 10, 10, 200, 20)
    $Button2 = GUICtrlCreateButton("hallo2", 10, 40, 200, 20)
    $Button3 = GUICtrlCreateButton("hallo3", 10, 80, 200, 20)
    $Button4 = GUICtrlCreateButton("hallo4", 10, 110, 200, 20)

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

    GUISetState()
    Sleep(1000)

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

    $ControlID = _GetControlByPos($GUI, 10, 80)
    GUICtrlSetData($ControlID, ":-) ID " & $ControlID)

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

    Sleep(2000)

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

    Func _GetControlByPos($hGui, $iX, $iY)
    For $i = 1 To 100
    $aPos = ControlGetPos($GUI, "", $i)
    If IsArray($aPos) And $iX = $aPos[0] And $iY = $aPos[1] Then Return $i
    Next
    Return -1
    EndFunc ;==>_GetControlByPos

    [/autoit]
    • Offizieller Beitrag

    Das geht auch einfacher:

    Spoiler anzeigen
    [autoit]


    #include <WinAPI.au3>

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

    $Struct = DllStructCreate($tagPoint)
    $hGui = GUICreate('Test')
    $hButton1 = GUICtrlCreateButton('1', 10, 10, 100, 20)
    $hButton2 = GUICtrlCreateButton('2', 120, 10, 100, 20)
    GUISetState()
    Do
    DllStructSetData($Struct, "x", MouseGetPos(0))
    DllStructSetData($Struct, "y", MouseGetPos(1))
    $hwnd = _WinAPI_WindowFromPoint($Struct)
    ToolTip('Aktuelle ID = ' & _WinAPI_GetDlgCtrlID($hwnd) & @CR & 'Button1-ID = ' & $hButton1 & @CR & 'Button2-ID = ' & $hButton2)
    Until GUIGetMsg() = -3

    [/autoit]
  • Und wieso musst du die controlid über die Position ermitteln? Speicher die Controlids doch einfach bei der Erstellung der Controls ab. Wenn du sehr viele Buttons hast und nicht jedem eine eigene Variable zuweisen willst benutz ein Array. Kannst ja mal das Script posten.

    Die andere Richtung würd ich eher verstehen, also anhand der ID die aktuelle Position bestimmen.

  • bei dem was ich mach brauch ichs so :P weil buttons variabel hinzugefügt/verwaltet werden.

    Programmiere Cube Touch XXL nach falls es jemand kennt.

  • Wenn du sehr viele Buttons hast und nicht jedem eine eigene Variable zuweisen willst benutz ein Array.


    Habe gerade das gleiche Problem und das wäre echt das Optimum. Aber wie stelle ich es an bei der Erstellung des Controls die ID in ein Array zu schreiben?

  • Hab dir zwar schon in deinem Thread geantwortet und ich behaupte mal, dass du kein Array benötigst, aber hier ein Beispiel:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <array.au3>

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

    global $array[9]

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

    ; gui
    $gui=guicreate("Meine GUI",480,200)

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

    ; Button Start Koordinaten
    $left = 10
    $top = 10
    $width = 60
    $height = 20

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

    ; erstellt eine reihe mit 5 Buttons und eine Spalte mit 5 Buttons... ungetestet
    for $i = 0 to ubound($array)-1
    $array[$i]= guictrlcreatebutton("Knopf Nr." & $i+1,$left,$top,$width,$height)
    if $i < 4 then
    $left += 70
    else
    $left = 10
    $top += 30
    endif
    next

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

    GUISetState()

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

    while 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    for $i = 0 to UBound($array)-1
    if $msg = $array[$i] Then
    MsgBox(0,"Knopf gedrückt", "Es wurde Knopf Nr." & $i+1 & " gedrückt.")
    _ArrayDisplay($array,"Inhalt des Control Arrays... hier sind alle control id's der buttons gespeichert...")
    EndIf
    Next
    wend

    [/autoit]

    3 Mal editiert, zuletzt von misterspeed (27. Juni 2011 um 14:07)