Hallo Autoitler,
ich hab ihr mal ne fragen. Ich benutze das Forum nun schon lange um irgendwelche Probleme zu lösen die bei mir immer wieder auftauchen. ![]()
Aber nun habe ich zum ersten mal keine Antwort für mein Problem gefunden. Und deshalb frag jetzt mal nach . ![]()
Ich hab vor, einen Drehbutton (Wie die Knöpfe von einem Mischpult) mit gdi zu schreiben. Nun mein Problem
Wenn ich nun den Button drehen möchte, d.h die mittlere Linie neu zu zeichnen (Ich lassen einfach nur die mittlerer Linie sich drehen als alles zu drehen)
geht diese immer über den den äußeren Rand meines Kreise, wie begrenze ich die Linie auf den Kreis. Ich hab schon alles ausprobiert. Sinus Cosinus,alles was so die schuhlmathematik taugt.
Aber komm einfach net weiter.
Hier mal mein Script
Ich weiß net sonderlich gut oder schön is halt nur zu testzwecken
Spoiler anzeigen
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.10.1
Author: myName
Script Function:
Template AutoIt script.
If $a < $Ctrl[6]/2 Then ;Wenn links von der hälfte geklickt wurde
If $a < $Ctrl[6]/3/2 Then ;wenn links über den Kreis geklickt wurde auf x ebene
$a = $Ctrl[6]/3/2
EndIf
Else; wenn rechts der hälfte geklickt wurde
If $a > $Ctrl[6] - ($Ctrl[6]/3)/2 Then ;wenn rechts über den kreis geklickt wurde
$a = $Ctrl[6] - ($Ctrl[6]/3)/2
EndIf
Endif
If $b < $Ctrl[7]/2 Then ;Wenn über die hälfte geklickt wird auf y Ebene
If $b < $Ctrl[7]/3/2 Then ;wenn über den Kreis geklickt wird
$b = $Ctrl[7]/3/2
EndIf
Else;wenn unterhalb der Hälfte der y Achse geklickt wurde
If $b > $Ctrl[7] -($Ctrl[7]/3/2) then ;wenn unterhalb des Kreises geklickt wurde
$b = ($Ctrl[7]/3/2) + ($Ctrl[7]/2)
EndIf
EndIf
#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]; Script Start - Add your code below here
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <Misc.au3>
#include <GDIPlus.au3>
Global Const $deg2rad = 180 / ACos(-1)
Global Const $rad2deg = ACos(-1) / 180
Global $DLL = DllOpen("user32.dll")
AutoItSetOption("MouseCoordMode",0)
_GDIPlus_Startup()
Dim $hWnd, $Label
$hWnd = GUICreate("",500,500,-1,-1)
Guisetstate()
[/autoit] [autoit][/autoit] [autoit]Dim $Button = _Create_DrehButton(100,100,100,100)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Endswitch
_Run_DrehButton($Button)
WEnd
Func _Create_DrehButton($x,$y,$w,$h,$text = "",$min = -12, $max = 12)
;$Array[0] = Label
;$Array[1] = Graphic
;$Array[2] = Pen
;$Array[3] = Brush
;$Array[4] = $x
;$Array[5] = $y
;$Array[6] = $w
;$Array[7] = $h
;$Array[8] = $min
;$Array[9] = $max
;$Array[10] = $Wert
Dim $Array[11]
$Array[0] = GUICtrlCreateLabel("",$x,$y,$w,$h,$SS_GRAYRECT )
$Array[1] = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($Array[0]))
[/autoit] [autoit][/autoit] [autoit];$hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(100, 20, $Array[1])
;$hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
$Array[2] = _GDIPlus_PenCreate(0xFF333333,2)
$Array[3] = _GDIPlus_BrushCreateSolid(0xFF999999)
$Array[4] = $x
$Array[5] = $y
$Array[6] = $w
$Array[7] = $h
$Array[8] = $min
$Array[9] = $max
$Array[10] = 0
_GDIPlus_GraphicsFillEllipse($Array[1],($w/3)/2,($h/3)/2,$w-($w/3),$h-($h/3),$Array[3]);innerer Kreis
_GDIPlus_GraphicsDrawEllipse($Array[1],($w/3)/2,($h/3)/2,$w-($w/3)+1,$h-($h/3)+1,$Array[2])
_GDIPlus_GraphicsDrawLine($Array[1],$w/2,$h/2,$w/2,($h/3)/2,$Array[2])
If @error Then Return -1
For $z = 0 to 180 Step 180
_GDIPlus_GraphicsDrawLine($Array[1],($w/3)/2 - 3,$h/2,($w/3)/2 -10,$h/2,$Array[2])
Next
Return $Array
EndFunc
Func _Run_DrehButton($Ctrl)
Dim $aInfo = GUIGetCursorInfo($hWnd), $iOldHoverID = 0;MouseHover
If @error Then MsgBox(0, "Error", "I´m sorry, the app has a problem with the calculation of the MousePos.")
If $aInfo[4] <> $iOldHoverID Then
Switch $aInfo[4]
Case $Ctrl[0] AND $aInfo[2] = 1
_ReDraw_DrehButton($Ctrl,$aInfo[0] , $aInfo[1])
EndSwitch
$aInfo[4] = $iOldHoverID
EndIf
EndFunc
Func _ReDraw_DrehButton($Ctrl, $x , $y)
Dim $c = 0, $d = 0, $angle, $wert = $Ctrl[10]
_GDIPlus_GraphicsClear($Ctrl[1], 0xFF999999)
_GDIPlus_GraphicsFillEllipse($Ctrl[1],($Ctrl[6]/3)/2,($Ctrl[7]/3)/2,$Ctrl[6]-($Ctrl[6]/3),$Ctrl[7]-($Ctrl[7]/3),$Ctrl[3]);innerer Kreis
_GDIPlus_GraphicsDrawEllipse($Ctrl[1],($Ctrl[6]/3)/2,($Ctrl[7]/3)/2,$Ctrl[6]-($Ctrl[6]/3)+1,$Ctrl[7]-($Ctrl[7]/3)+1,$Ctrl[2])
;$Ctrl[6]/3 Radius
[/autoit] [autoit][/autoit] [autoit]Dim $radius = $Ctrl[6]/3
$a = $x - $Ctrl[4];x
$b = $y - $Ctrl[5];y
$angle = ATan(($Ctrl[7] - $b) / $a) * $deg2rad
[/autoit] [autoit][/autoit] [autoit]$len = Pixel_Distance($a, $b,$Ctrl[6]/2 , $Ctrl[7]/2)
[/autoit] [autoit][/autoit] [autoit]If $len > $radius Then ; größer als Radius
[/autoit] [autoit][/autoit] [autoit]$lx = Cos($angle * $rad2deg) * $radius
$ly = Sin($angle * $rad2deg) * $radius
_GDIPlus_GraphicsDrawLine($Ctrl[1], $Ctrl[6]/2, $Ctrl[7]/2, $lx, $Ctrl[7] - $ly, $Ctrl[3])
ElseIf $len < $Ctrl[6]/3 Then
EndIf
ConsoleWrite("$a: " & $a & " $b: " & $b & " $x: " & $x & " $y: " & $y & " $Ctrl[4]: " & $Ctrl[4] & " $Ctrl[5]: " & $Ctrl[5] & @lf)
;ConsoleWrite("Pixel_Distance: " & Pixel_Distance($a, $b ,$Ctrl[6]/2, $Ctrl[7] / 2 ) & @LF)
;ConsoleWrite("Radius: " & $Ctrl[6]/3 & @lf )
;_GDIPlus_GraphicsDrawLine($Ctrl[1],$Ctrl[6]/2,$Ctrl[7]/2,$a,$b,$Ctrl[2])
If @error Then Return -1
For $x = 0 to 180 Step 180
_GDIPlus_GraphicsDrawLine($Ctrl[1],($Ctrl[6]/3)/2 - 3,$Ctrl[7]/2,($Ctrl[6]/3)/2 -10,$Ctrl[7]/2,$Ctrl[2])
Next
EndFunc
Func Pixel_Distance($x1, $y1, $x2, $y2) ;Pythagoras theorem
Local $a, $b, $c
If $x2 = $x1 And $y2 = $y1 Then
Return 0
Else
$a = $y2 - $y1
$b = $x2 - $x1
$c = Sqrt($a * $a + $b * $b)
Return $c
EndIf
EndFunc ;==>Pixel_Distance
Also nur her mit allen Lösungen, Verbesserungen oder Kritiken