Heyo,
mir gelingt es einfach nicht, 2 Slider gleichzeitig funktionsfähig zu erstellen.
Einzeln gehen sie wunderbar (horizontal/vertikal), aber wenn man mehr
als einen Slider erstellt, spinnen alle total rum.
Könnt ihr vielleicht einmal drauf schauen?
AutoIt
#include <GuiConstants.au3>
#include <GdiPlus.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $GUI_Width = 200
Global $GUI_Height = 200
Global $GdiStartX = 0
Global $GdiStartY = 0
$user32DLL = DllOpen("user32.dll")
Global $isSlide = False
Global $clicked = False
;~ $sliderIs = False
Global $slide[2]
For $i = 0 To 1
$slide[$i] = 0
Next
_GDIPlus_Startup()
$main_gui = GUICreate("", $GUI_Width, $GUI_Height, -1, -1)
$graphic = _GDIPlus_GraphicsCreateFromHWND($main_gui)
$bitmap = _GDIPlus_BitmapCreateFromGraphics(200, 200, $graphic)
$buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
$gdiBg = _GDIPlus_BrushCreateSolid(0xFF99BDBD)
$gdiSlider = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$gdiSliderBg = _GDIPlus_BrushCreateSolid(0xFF585858)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_MouseEvent")
GUISetState(@SW_SHOW)
Do
_Draw()
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func _Draw()
_GDIPlus_GraphicsClear($buffer)
_GDIPlus_GraphicsFillRect($buffer, 0, 0, 200, 200, $gdiBg)
Global $sNum = 0
_slider1(10, 10, 2, 150, 1, 10) ; ( $x1, $y1, $x2, $y2 [, $sState = 0 [, $maxNum = 100 [, $sSize = 2]]] )
;~ _slider1()
Global $sNum = 1
_slider1(10, 180, 150, 2, 0, 100)
_GDIPlus_GraphicsDrawImage($graphic, $bitmap, $GdiStartX, $GdiStartY)
EndFunc
Func _slider1($x1, $y1, $x2, $y2, $sState = 0, $maxNum = 100, $sSize = 10)
;~ Func _slider1()
Local $steps
Global $s1_X1, $s1_Y1, $s1_Y2, $s1_Size, $s1_State
; REQUIRED_SETTINGS
;~ $x1 = 10 ; x from
;~ $y1 = 10 ; y from
;~ $x2 = 2 ; x2 to (-i- HORIZONTAL: must be bigger than slider size)
;~ $y2 = 150 ; y2 to (-i- VERTICAL: must be bigger than slider size)
; END_OF_REQUIRED_SETTINGS
; OPTIONAL_SETTINGS
;~ $sState = 1 ; -i- HORIZONTAL: 0, VERTICAL: 1
;~ $sSize = 10 ; -i- HORIZONTAL: x, VERTICAL: y size from slider
;~ $maxNum = 10 ; max number
; END_OF_OPTIONAL_SETTINGS
; INTERN_CALC
If $sState = 0 Then
$s1_X1 = $x1 + $slide[$sNum]
$s1_Y1 = $y1 - $y2 * 2
$s1_Y2 = $y2 * 5
$steps = ($x2-$sSize) / $maxNum
Else
$s1_X1 = $x1 - $x2 * 2
$s1_Y1 = $y1 + $slide[$sNum]
$s1_Y2 = $x2 * 5
$steps = ($y2-$sSize) / $maxNum
EndIf
$s1_Size = $sSize
$s1_State = $sState
;~ $sTip = "jo"
; END_OF_INTERN_CALC
If _IsPressed(01, $user32DLL) And $clicked Then
; TEST
If $sState = 0 Then
_GDIPlus_GraphicsFillRect($buffer, $x1, $y1, $x2, $y2, $gdiSliderBg)
_GDIPlus_GraphicsFillRect($buffer, $s1_X1, $s1_Y1, $sSize, $s1_Y2, $gdiSlider)
Else
_GDIPlus_GraphicsFillRect($buffer, $x1, $y1, $x2, $y2, $gdiSliderBg)
_GDIPlus_GraphicsFillRect($buffer, $s1_X1, $s1_Y1, $s1_Y2, $sSize, $gdiSlider)
EndIf
; END_OF_TEST
If Not $isSlide Then
$isSlide = True
Global $mPos1 = MouseGetPos()
Global $gSlide = $slide[$sNum]
EndIf
If $isSlide Then
Local $mPos2 = MouseGetPos()
If $sState = 0 Then
; -i- HORIZONTAL
If $mPos2[0] > ($mPos1[0] + $slide[$sNum] - $gSlide) + $steps And $slide[$sNum] < $x2 - $sSize Then
Local $speed = 1
$slide[$sNum] += $steps * $speed
ElseIf $mPos1[0] > ($mPos2[0] - $slide[$sNum] + $gSlide) + $steps And $slide[$sNum] > 0 Then
Local $speed = 1
$slide[$sNum] -= $steps * $speed
EndIf
; anti over- / underflow
If $slide[$sNum] > $x2 - $sSize Then
$slide[$sNum] = $x2 - $sSize
ElseIf $slide[$sNum] < 0 Then
$slide[$sNum] = 0
EndIf
Else
; -i- VERTICAL
If $mPos2[1] > ($mPos1[1] + $slide[$sNum] - $gSlide) + $steps And $slide[$sNum] < $y2 - $sSize Then
Local $speed = 1
$slide[$sNum] += $steps * $speed
ElseIf $mPos1[1] > ($mPos2[1] - $slide[$sNum] + $gSlide) + $steps And $slide[$sNum] > 0 Then
Local $speed = 1
$slide[$sNum] -= $steps * $speed
EndIf
; anti over- / underflow
If $slide[$sNum] > $y2 - $sSize Then
$slide[$sNum] = $y2 - $sSize
ElseIf $slide[$sNum] < 0 Then
$slide[$sNum] = 0
EndIf
EndIf
EndIf
Else
$isSlide = False
$clicked = False
EndIf
;~ If $isSlide And $sNum <> $sliderIs Then
;~ Return False
;~ EndIf
If $sState = 0 Then
_GDIPlus_GraphicsFillRect($buffer, $x1, $y1, $x2, $y2, $gdiSliderBg)
_GDIPlus_GraphicsFillRect($buffer, $s1_X1, $s1_Y1, $sSize, $s1_Y2, $gdiSlider)
Else
_GDIPlus_GraphicsFillRect($buffer, $x1, $y1, $x2, $y2, $gdiSliderBg)
_GDIPlus_GraphicsFillRect($buffer, $s1_X1, $s1_Y1, $s1_Y2, $sSize, $gdiSlider)
EndIf
Local $visualNum = Int($slide[$sNum] / $steps)
;~ FileWriteLine("test.log", $visualNum)
ToolTip($visualNum, 0, 0)
EndFunc
Func _MouseEvent()
Local $aMousePos, $rectX, $rectY, $rectX2, $rectY2
$aMousePos = GUIGetCursorInfo($main_gui)
If $s1_State = 0 Then
$rectX = $GdiStartX + $s1_X1
$rectY = $GdiStartY + $s1_Y1
$rectX2 = $s1_Size
$rectY2 = $s1_Y2
Else
$rectX = $GdiStartX + $s1_X1
$rectY = $GdiStartY + $s1_Y1
$rectX2 = $s1_Y2
$rectY2 = $s1_Size
EndIf
;~ MsgBox(0, "", "x=" & $rectX & ", y=" & $rectY & ", x2=" & $rectX2 & ", y2=" & $rectY2)
If _PtIsInRect($aMousePos[0], $aMousePos[1], $rectX, $rectY, $rectX2, $rectY2) Then
$clicked = True
;~ Global $sliderIs = 1 ; test
EndIf
EndFunc
Func _PtIsInRect($iXPoint, $iYPoint, $iXRect, $iYRect, $iWidthRect, $iHeightRect)
If $iXPoint >= $iXRect And $iYPoint >= $iYRect And $iXPoint <= $iXRect + $iWidthRect And $iYPoint <= $iYRect + $iHeightRect Then Return 1
Return 0
EndFunc
Func _MouseOverControl($iControl)
Local $aCursor = GUIGetCursorInfo($main_gui)
If Not IsArray($aCursor) Then Return False
If $aCursor[4] = $iControl Then
Return True
EndIf
EndFunc
Func _Exit()
_GDIPlus_GraphicsDispose($graphic)
_GDIPlus_GraphicsDispose($buffer)
_GDIPlus_BitmapDispose($bitmap)
_GDIPlus_Shutdown()
Exit
EndFunc
Alles anzeigen