_MouseTrapCircle() - Mouse Trapping in einem Kreis

    • Offizieller Beitrag

    Analog zu _MouseTrap(), womit die Maus in einem Rechteck gehalten wird kann mit dieser Funktion die Maus in einem Kreis gefangen gehalten werden. :D

    Features:
    • Absolute Koordinaten oder (durch Übergabe eines Fensterhandle) relative Koordinaten in diesem Fenster
    • Optionaler Timeout zum zeitlimitierten Beenden


    Es ist nicht ganz perfekt: Mit einer sehr schnellen Mausbewegung kann man ausreißen. Bei Verwendung auf einer GUI landet man aber wieder darauf und wird bei der nächsten Bewegung wieder eingefangen. Die GUI kann nicht verlassen werden.

    Edit: Kleine Korrektur in Skript und Bsp.

    MouseTrapCircle.au3 v0.3
    [autoit]

    #Region - TimeStamp
    ; 2012-07-23 16:52:11 v 0.3
    #EndRegion - TimeStamp

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

    #include-once
    #Include <WindowsConstants.au3>
    #Include <WinAPI.au3>

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

    OnAutoItExitRegister('__MouseTrapCircle_ShutDown')

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

    If Not IsDeclared('$__HC_ACTION') Then Global Const $__HC_ACTION = 0
    Global $__hSTUB__MouseProcTrap, $__hMOD_TRAP, $__hHOOK_MOUSE_TRAP
    Global $__iXCtr_Trap, $__iYCtr_Trap, $__iRadius_Trap, $__hWND_Trap
    Global $__MouseTrapCircle_Started = False, $__Timer_Trap = -1, $__iTimeout_Trap
    Global $__iTopBorder, $__iSideBorder
    _SystemGetWindowBorder($__iTopBorder, $__iSideBorder)

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

    ;===============================================================================
    ; Function Name....: _MouseTrapCircle
    ; Description......: Hold the mouse trapped in a circle
    ; .................: Call without parameters, ends trapping.
    ; Parameter(s).....: $_iXCentre x-coordinate of the circle center
    ; .................: $_iYCentre y-coordinate of the circle center
    ; .................: $_iRadius Radius of the circle
    ; ........optional.: $_iTimeout Time in ms after trapping ends, without an function call (Default=-1, no timeout)
    ; ........optional.: $_hWnd If given: $_iXCentre and $_iYCentre are used as relative to this window.
    ; .................: Default: Coordinates are absolut on screen
    ; Return Value(s)..: Nothing
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _MouseTrapCircle($_iXCentre=-1, $_iYCentre=-1, $_iRadius=-1, $_iTimeout=-1, $_hWnd=-1)
    If $_iXCentre = -1 Or $_iYCentre = -1 Or $_iRadius = -1 Then
    __MouseTrapCircle_ShutDown()
    Else
    __MouseTrapCircle_StartUp($_iXCentre, $_iYCentre, $_iRadius, $_iTimeout, $_hWnd)
    EndIf
    EndFunc ;==>_MouseTrapCircle

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

    #region - Internal functions
    ;===============================================================================
    ; Function Name....: __MouseTrapCircle_StartUp
    ; Description......: Initialize functions
    ;===============================================================================
    Func __MouseTrapCircle_StartUp($_iXCentre, $_iYCentre, $_iRadius, $_iTimeout, $_hWnd)
    $__MouseTrapCircle_Started = True
    $__iXCtr_Trap = $_iXCentre
    $__iYCtr_Trap = $_iYCentre
    $__iRadius_Trap = $_iRadius
    $__hWND_Trap = $_hWnd
    If IsHWnd($__hWND_Trap) Then
    Local $aWin = WinGetPos($__hWND_Trap)
    $__iXCtr_Trap = $aWin[0] + $__iSideBorder + $__iXCtr_Trap
    $__iYCtr_Trap = $aWin[1] + $__iTopBorder + $__iYCtr_Trap
    EndIf
    If $_iTimeout > 0 Then
    $__Timer_Trap = TimerInit()
    $__iTimeout_Trap = $_iTimeout
    EndIf
    ; == initialize Callback Function to analyze MOUSE-Message
    $__hSTUB__MouseProcTrap = DllCallbackRegister("__MouseProcTrap", "long", "int;wparam;lparam")
    $__hMOD_TRAP = _WinAPI_GetModuleHandle(0)
    $__hHOOK_MOUSE_TRAP = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($__hSTUB__MouseProcTrap), $__hMOD_TRAP)
    EndFunc ;==>__MouseTrapCircle_StartUp

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

    ;===============================================================================
    ; Function Name....: __MouseTrapCircle_ShutDown
    ; Description......: Close ressources
    ;===============================================================================
    Func __MouseTrapCircle_ShutDown()
    If $__MouseTrapCircle_Started Then
    _WinAPI_UnhookWindowsHookEx($__hHOOK_MOUSE_TRAP)
    DllCallbackFree($__hSTUB__MouseProcTrap)
    EndIf
    EndFunc ;==>__MouseTrapCircle_ShutDown

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

    ;===============================================================================
    ; Function Name....: __MouseProcTrap
    ; Description......: Callback mouse procedure
    ;===============================================================================
    Func __MouseProcTrap($nCode, $wParam, $lParam)
    If $__Timer_Trap <> -1 And TimerDiff($__Timer_Trap) >= $__iTimeout_Trap Then Return __MouseTrapCircle_ShutDown()
    If $nCode <> $__HC_ACTION Then Return _WinAPI_CallNextHookEx($__hHOOK_MOUSE_TRAP, $nCode, $wParam, $lParam)
    Local Static $iXComp = -1, $iYComp = -1
    Local $iX, $iY, $iXMove, $iYMove, $oldOpt
    Local $iDirX = 0, $iDirY = 0
    Local $tMSLLHOOKSTRUCT = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
    Local $tPoint = DllStructCreate('int;int')
    $iX = DllStructGetData($tMSLLHOOKSTRUCT, 1)
    $iY = DllStructGetData($tMSLLHOOKSTRUCT, 2)
    DllStructSetData($tPoint, 1, $iX)
    DllStructSetData($tPoint, 2, $iY)
    If $iXComp = -1 Then
    $iXComp = $iX
    $iYComp = $iY
    EndIf

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

    Switch $wParam
    Case $WM_MOUSEMOVE
    If $iX > $iXComp Then
    $iDirX = -1
    ElseIf $iX < $iXComp Then
    $iDirX = 1
    EndIf
    If $iY > $iYComp Then
    $iDirY = -1
    ElseIf $iY < $iYComp Then
    $iDirY = 1
    EndIf
    If Not _PointInCircle($iX, $iY, $__iXCtr_Trap, $__iYCtr_Trap, $__iRadius_Trap) Then
    $oldOpt = Opt('MouseCoordMode', 1)
    MouseMove($iX +($iDirX), $iY +($iDirY), 0)
    If IsHWnd($__hWND_Trap) Then
    Local $tRect = _WinAPI_GetWindowRect($__hWND_Trap)
    If Not _WinAPI_PtInRect($tRect, $tPoint) Then MouseMove($__iXCtr_Trap, $__iYCtr_Trap, 0)
    EndIf
    Opt('MouseCoordMode', $oldOpt)
    Return -1
    EndIf

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

    EndSwitch

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

    Return _WinAPI_CallNextHookEx($__hHOOK_MOUSE_TRAP, $nCode, $wParam, $lParam)
    EndFunc ;==>__MouseProcTrap

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

    ;===============================================================================
    ; Function Name....: __PointInCircle
    ; Description......: Calculates whether given position within a circle
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _PointInCircle($_iXPt, $_iYPt, $_iXCircle, $_iYCircle, $_iRadius)
    Return ((Sqrt(($_iXCircle-Abs($_iXPt))^2 + ($_iYCircle-Abs($_iYPt))^2)) < $_iRadius)
    EndFunc ;==>__PointInCircle

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

    ;===============================================================================
    ; Function Name....: __SystemGetWindowBorder
    ; Description......: Calculates side and top border of window
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _SystemGetWindowBorder(ByRef $_iTopBorder, ByRef $_iSideBorder)
    Local Const $SM_CYCAPTION = 4, $SM_CYEDGE = 46, $SM_CYBORDER = 6, $SM_CXBORDER = 5, $SM_CXEDGE = 45
    Local $aMetrics[5][2] = [[$SM_CYCAPTION], [$SM_CYEDGE], [$SM_CYBORDER], [$SM_CXBORDER], [$SM_CXEDGE]]
    Local $dll = DllOpen("user32.dll"), $aRet
    For $i = 0 To 4
    $aRet = DllCall($dll, "int", "GetSystemMetrics", "int", $aMetrics[$i][0])
    If IsArray($aRet) Then $aMetrics[$i][1] = $aRet[0]
    Next
    DllClose($dll)
    $_iTopBorder = $aMetrics[0][1] + $aMetrics[1][1] + $aMetrics[2][1]
    $_iSideBorder = $aMetrics[3][1] + $aMetrics[4][1]
    EndFunc ;==>__SystemGetWindowBorder
    #endregion

    [/autoit]
    Beispiel
    [autoit]

    #Region - TimeStamp
    ; 2012-07-23 17:52:55
    #EndRegion - TimeStamp
    #Include <GDIPlus.au3>
    #Include <GUIConstantsEx.au3>
    #Include "MouseTrapCircle.au3"

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

    _Main()

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

    Func _Main()

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

    Local $hGui, $hPen, $hBrush1, $hBrush2, $hGraphic
    Local $iTop, $iSide, $sTitle = 'MouseTrapCircle'
    Local $fStart = False
    _SystemGetWindowBorder($iTop, $iSide)

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

    $hGui = GUICreate($sTitle & ' [OFF]', 300, 300, 400, 100)
    GUICtrlCreateLabel('Click inside circle to start/stop', 80, 50)
    GUISetState(@SW_SHOW, $hGui)

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

    _GDIPlus_Startup()
    $hPen = _GDIPlus_PenCreate(0xFF0000FF)
    $hBrush1 = _GDIPlus_BrushCreateSolid(0xFFFFFACD)
    $hBrush2 = _GDIPlus_BrushCreateSolid(0xFFDD2233)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, 2)

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

    _GDIPlus_GraphicsFillCircleByCentre($hGraphic, 150, 150, 90, $hBrush1)
    _GDIPlus_GraphicsDrawCircleByCentre($hGraphic, 150, 150, 90, $hPen)

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

    While True
    Switch GUIGetMsg()
    Case -3
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush1)
    _GDIPlus_BrushDispose($hBrush2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    Case $GUI_EVENT_PRIMARYUP
    Local $aMouse = MouseGetPos()
    Local $aWin = WinGetPos($hGui)
    If _PointInCircle($aMouse[0], $aMouse[1], $aWin[0]+$iSide+150, $aWin[1]+$iTop+150, 45) Then
    $fStart = Not $fStart
    If $fStart Then
    WinSetTitle($hGui, '', $sTitle & ' [ON]')
    _GDIPlus_GraphicsFillCircleByCentre($hGraphic, 150, 150, 90, $hBrush2)
    _GDIPlus_GraphicsDrawCircleByCentre($hGraphic, 150, 150, 90, $hPen)
    _MouseTrapCircle(150, 150, 45, -1, $hGui)
    Else
    WinSetTitle($hGui, '', $sTitle & ' [OFF]')
    _MouseTrapCircle()
    _GDIPlus_GraphicsFillCircleByCentre($hGraphic, 150, 150, 90, $hBrush1)
    _GDIPlus_GraphicsDrawCircleByCentre($hGraphic, 150, 150, 90, $hPen)
    EndIf
    EndIf
    EndSwitch
    WEnd

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

    EndFunc

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

    Func _GDIPlus_GraphicsDrawCircleByCentre($_hGraphic, $_iX, $_iY, $_iDiameter, $_hPen=0)
    $_iX -= $_iDiameter/2
    $_iY -= $_iDiameter/2
    _GDIPlus_GraphicsDrawEllipse($_hGraphic, $_iX, $_iY, $_iDiameter, $_iDiameter, $_hPen)
    EndFunc

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

    Func _GDIPlus_GraphicsFillCircleByCentre($_hGraphic, $_iX, $_iY, $_iDiameter, $_hBrush=0)
    $_iX -= $_iDiameter/2
    $_iY -= $_iDiameter/2
    _GDIPlus_GraphicsFillEllipse($_hGraphic, $_iX, $_iY, $_iDiameter, $_iDiameter, $_hBrush)
    EndFunc

    [/autoit]
  • Ich hab noch nen Bug im Beispiel gefunden. Wenn man direkt nach dem starten des Scripts ca. 10 Pixel neben den Kreis tippt, schwau mal was passiert.

    • Offizieller Beitrag

    Fehler gefunden: Ich hatte _PointInCircle vorher mit Durchmesser verwendet und dann zu Radius geändert. Die Änderung hatte ich aber im Bsp.-Aufruf dieser Funktion vergessen durchzuführen. Gleich mal ändern.

  • Auch wenn es unwahrscheinlich ist dass $_iXPt, und $_iYPt negative Werte annehmen solltest du vielleicht dennoch die Abs() aus der Funktion _PointInCircle entfernen damit z.B. solche Aufrufe auch korrekte Werte liefern:

    [autoit]

    _PointInCircle(2, -1, 2, 2, 2)

    [/autoit]
  • So hier ist mal mein Drehknopf.

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include "MouseTrapCircle.au3"

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

    Global $iAngle, $aMouse, $iMsg, $iOptOld
    Global $iTop, $iSide, $sTitle = 'Test MouseTrapCircle'
    Global $fStart = False
    Global $rDeg = 180 / ACos(-1)
    Global $rPi = 3.14159265358979
    Global $rDegToRad = $rPi / 180
    Global $iX1Last, $iY1Last, $iX2Last, $iY2Last, $iAngleLast

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

    _SystemGetWindowBorder($iTop, $iSide)

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

    Global $hGui = GUICreate($sTitle & ' [OFF]', 300, 300)
    Global $cValue = GUICtrlCreateLabel("", 130, 60, 100, 20)
    GUICtrlSetFont(-1, 14)
    GUISetState()

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

    _GDIPlus_Startup()
    Global $hPen1 = _GDIPlus_PenCreate(0xFF0000FF)
    Global $hPen2 = _GDIPlus_PenCreate(0xFF0000FF, 2)
    Global $hPen3 = _GDIPlus_PenCreate(0xFFFFFACD, 6)
    Global $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFACD)
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, 2)

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

    _GDIPlus_GraphicsFillCircleByCentre($hGraphic, 150, 150, 90, $hBrush)
    _GDIPlus_GraphicsDrawCircleByCentre($hGraphic, 150, 150, 90, $hPen1)
    _GDIPlus_GraphicsDrawLine($hGraphic, 170, 150, 190, 150, $hPen2)

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

    $iX1Last = 170
    $iY1Last = 150
    $iX2Last = 190
    $iY2Last = 150
    $iAngleLast = 0

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

    While True
    If $fStart Then
    $iOptOld = Opt('MouseCoordMode', 2)
    $aMouse = MouseGetPos()
    Select
    Case $aMouse[0] >= 150 And $aMouse[1] <= 150
    If $iAngleLast < 350 Then
    $iAngle = (150 - $aMouse[1]) / ($aMouse[0] - 150)
    $iAngle = Int(ATan($iAngle) * $rDeg)
    If $iAngle = 0 Then
    _DeleteLastLine($hGraphic, $iX1Last, $iY1Last, $iX2Last, $iY2Last, $iAngleLast, $hPen3)
    _GDIPlus_GraphicsDrawLine($hGraphic, 170, 150, 190, 150, $hPen2)
    $iX1Last = 170
    $iY1Last = 150
    $iX2Last = 190
    $iY2Last = 150
    $iAngleLast = 0
    ElseIf $iAngle = 90 Then
    _DeleteLastLine($hGraphic, $iX1Last, $iY1Last, $iX2Last, $iY2Last, $iAngleLast, $hPen3)
    _GDIPlus_GraphicsDrawLine($hGraphic, 150, 130, 150, 110, $hPen2)
    $iX1Last = 150
    $iY1Last = 130
    $iX2Last = 150
    $iY2Last = 110
    $iAngleLast = 90
    Else
    __GDIPlus_GraphicsDrawLine()
    EndIf
    EndIf
    Case $aMouse[0] < 150 And $aMouse[1] <= 150
    $iAngle = (150 - $aMouse[1]) / (150 - $aMouse[0])
    $iAngle = 90 - Int(ATan($iAngle) * $rDeg) + 90
    If $iAngle = 180 Then
    _DeleteLastLine($hGraphic, $iX1Last, $iY1Last, $iX2Last, $iY2Last, $iAngleLast, $hPen3)
    _GDIPlus_GraphicsDrawLine($hGraphic, 130, 150, 110, 150, $hPen2)
    $iX1Last = 130
    $iY1Last = 150
    $iX2Last = 110
    $iY2Last = 150
    $iAngleLast = 180
    Else
    __GDIPlus_GraphicsDrawLine()
    EndIf
    Case $aMouse[0] < 150 And $aMouse[1] > 150
    $iAngle = ($aMouse[1] - 150) / (150 - $aMouse[0])
    $iAngle = Int(ATan($iAngle) * $rDeg) + 180
    __GDIPlus_GraphicsDrawLine()
    Case $aMouse[0] >= 150 And $aMouse[1] > 150
    If $iAngleLast > 10 Then
    $iAngle = ($aMouse[1] - 150) / ($aMouse[0] - 150)
    $iAngle = 90 - Int(ATan($iAngle) * $rDeg) + 270
    If $iAngle = 270 Then
    _DeleteLastLine($hGraphic, $iX1Last, $iY1Last, $iX2Last, $iY2Last, $iAngleLast, $hPen3)
    _GDIPlus_GraphicsDrawLine($hGraphic, 150, 170, 150, 190, $hPen2)
    $iX1Last = 150
    $iY1Last = 170
    $iX2Last = 150
    $iY2Last = 190
    $iAngleLast = 270
    Else
    __GDIPlus_GraphicsDrawLine()
    EndIf
    EndIf
    EndSelect
    Opt('MouseCoordMode', $iOptOld)
    GUICtrlSetData($cValue, Int(($iAngle * 1000) / 359))
    EndIf

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

    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case -3
    _GDIPlus_PenDispose($hPen1)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_PenDispose($hPen3)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    Case $GUI_EVENT_PRIMARYDOWN, $GUI_EVENT_PRIMARYUP
    $aMouse = MouseGetPos()
    Local $aWin = WinGetPos($hGui)
    If _PointInCircle($aMouse[0], $aMouse[1], $aWin[0] + $iSide + 150, $aWin[1] + $iTop + 150, 45) Then
    $fStart = Not $fStart
    If $fStart And $iMsg = $GUI_EVENT_PRIMARYDOWN Then
    WinSetTitle($hGui, '', $sTitle & ' [ON]')
    _MouseTrapCircle(150, 150, 45, -1, $hGui)
    Else
    WinSetTitle($hGui, '', $sTitle & ' [OFF]')
    _MouseTrapCircle()
    EndIf
    EndIf
    EndSwitch
    WEnd

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

    Func __GDIPlus_GraphicsDrawLine()
    $iX1 = Cos($iAngle * $rDegToRad) * 20
    $iY1 = Sin($iAngle * $rDegToRad) * 20
    $iX2 = Cos($iAngle * $rDegToRad) * 40
    $iY2 = Sin($iAngle * $rDegToRad) * 40
    _DeleteLastLine($hGraphic, $iX1Last, $iY1Last, $iX2Last, $iY2Last, $iAngleLast, $hPen3)
    _GDIPlus_GraphicsDrawLine($hGraphic, 150 + $iX1, 150 - $iY1, 150 + $iX2, 150 - $iY2, $hPen2)
    $iX1Last = 150 + $iX1
    $iY1Last = 150 - $iY1
    $iX2Last = 150 + $iX2
    $iY2Last = 150 - $iY2
    $iAngleLast = $iAngle
    EndFunc

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

    Func _DeleteLastLine($_hGraphic, $_iX1, $_iY1, $_iX2, $_iY2, $iAngle, $_hPen = 0)
    Switch $iAngle
    Case 0
    _GDIPlus_GraphicsDrawLine($_hGraphic, $_iX1 - 2, $_iY1, $_iX2 + 2, $_iY2, $_hPen)
    Case 90
    _GDIPlus_GraphicsDrawLine($_hGraphic, $_iX1, $_iY1 + 2, $_iX2, $_iY2 - 2, $_hPen)
    Case 180
    _GDIPlus_GraphicsDrawLine($_hGraphic, $_iX1 + 2, $_iY1, $_iX2 - 2, $_iY2, $_hPen)
    Case 270
    _GDIPlus_GraphicsDrawLine($_hGraphic, $_iX1, $_iY1 - 2, $_iX2, $_iY2 + 2, $_hPen)
    Case 1 To 89
    _GDIPlus_GraphicsDrawLine($_hGraphic, $_iX1 - 2, $_iY1 + 2, $_iX2 + 2, $_iY2 - 2, $_hPen)
    Case 91 To 179
    _GDIPlus_GraphicsDrawLine($_hGraphic, $_iX1 + 2, $_iY1 + 2, $_iX2 - 2, $_iY2 - 2, $_hPen)
    Case 181 To 269
    _GDIPlus_GraphicsDrawLine($_hGraphic, $_iX1 + 2, $_iY1 - 2, $_iX2 - 2, $_iY2 + 2, $_hPen)
    Case Else
    _GDIPlus_GraphicsDrawLine($_hGraphic, $_iX1 - 2, $_iY1 - 2, $_iX2 + 2, $_iY2 + 2, $_hPen)
    EndSwitch
    EndFunc

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

    Func _GDIPlus_GraphicsDrawCircleByCentre($_hGraphic, $_iX, $_iY, $_iDiameter, $_hPen=0)
    $_iX -= $_iDiameter / 2
    $_iY -= $_iDiameter / 2
    _GDIPlus_GraphicsDrawEllipse($_hGraphic, $_iX, $_iY, $_iDiameter, $_iDiameter, $_hPen)
    EndFunc

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

    Func _GDIPlus_GraphicsFillCircleByCentre($_hGraphic, $_iX, $_iY, $_iDiameter, $_hBrush=0)
    $_iX -= $_iDiameter / 2
    $_iY -= $_iDiameter / 2
    _GDIPlus_GraphicsFillEllipse($_hGraphic, $_iX, $_iY, $_iDiameter, $_iDiameter, $_hBrush)
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    @m-obi
    Ja, in diese Richtung geht es bei mir. Allerdings etwas komplexer (wird daher auch noch etwas dauern). Und natürlich als UDF (_GuiCtrlDial_Create etc.). Wär ja katastrophal, wenn man in sein Skript solch recht umfangreiche Bearbeitung nur für ein Ctrl einbauen müßte.
    Zumal die Gestaltung des Drehknopfes der geringste Aufwand ist. Aufwändig ist die Verwaltung für (beliebig) viele Control auf (beliebig) vielen GUI.
    Interessant ist auch, die Herangehensweise an das Zeichnen/Berechnen. Da gehe ich etwas andere Wege als du. ;)
    Aber lass dich überraschen. Es kommt auch noch einiges an Funktionalität hinzu. Aber, wie gesagt, kann das noch etwas dauern.

  • Ich hatte mir schon gedacht, dass da von dir was besseres kommen wird. Ist man ja schließlich gewohnt von dir. Meins war nur Test um zu gucken ob es funktioniert.

    • Offizieller Beitrag

    BugFix, eigentlich solltest du deinen Titel von "King of Array" in "The UDF Master" ändern :D:thumbup:

  • Sehr praktisch :) Nur leider "entwischt" die Maus leicht.
    Aber warum legst du um den Kreis herum nicht noch ein _MouseTrap (also so wie in der Grafik das rote Rechteck)? Dann kann die Maus maximal in die grünen Flächen, aber keinesfalls auserhalb des roten Rechtecks kommen.
    [Blockierte Grafik: http://s7.directupload.net/images/120724/f7jd5j3y.jpg]