Что нового

GUICtrlCreateSlider и работа с мышью

Arei

Скриптер
Сообщения
938
Репутация
115
Здравствуйте, такая проблема как мне сделать, при клике на Slider, чтобы он ставил указатель на место где был совершён клик,а не +-20 значений.Заранее спасибо.
 

agikon

Знающий
Сообщения
789
Репутация
16
может слишком маленький слайдер по оси X?
я делал слайдер и у меня градиент получается очень маленький, почему у вас 20 не понимаю.
Код:
$slider = GUICtrlCreateSlider (10,20,150,20)
GUICtrlSetLimit(-1,255,0)
_IsPressed
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
да немного меньше, но не то.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Вот, но работает не совсем корректно:
Код:
#include <GUIConstantsEx.au3>
#include <SliderConstants.au3>

GuiCreate("Test", 550, 38)
$Slider1 = GUICtrlCreateSlider(10, 7, 530, 25, $TBS_NOTICKS)
GUICtrlSetLimit(-1, 100, 0)
GuiSetState()

While 1
    Switch GuiGetMsg()
       Case $GUI_EVENT_CLOSE
           Exit
       Case $GUI_EVENT_PRIMARYDOWN
		   _SetValue($Slider1)
    EndSwitch
WEnd

Func _SetValue($iControl)
	$a = GUIGetCursorInfo()
    $cpos = ControlGetPos ('', '', $iControl)
	If $a[4] = $iControl and $a[2] = 1 then GuiCtrlSetdata($iControl, ($a[0] / ($cpos[2] /100)) -1)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,717
Код:
#Include <GUIConstantsEx.au3>
#Include <GUISlider.au3>
#Include <SliderConstants.au3>
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>

Global Const $TB_LINEUP = 0
Global Const $TB_LINEDOWN = 1
Global Const $TB_PAGEUP = 2
Global Const $TB_PAGEDOWN = 3
Global Const $TB_THUMBPOSITION = 4
Global Const $TB_THUMBTRACK = 5
Global Const $TB_TOP = 6
Global Const $TB_BOTTOM = 7
Global Const $TB_ENDTRACK = 8

Global $Pos = -1

$hForm = GUICreate('MyGUI', 400, 100)
$Slider = GUICtrlCreateSlider(20, 10, 360, 30)
$hSlider = GUICtrlGetHandle($Slider)
GUIRegisterMsg($WM_HSCROLL, 'WM_HSCROLL')
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_HSCROLL($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Switch $lParam
				Case $hSlider
					If $Pos <> -1 Then
						_GUICtrlSlider_SetPos($hSlider, $Pos)
					Else
						Switch $wParam
							Case $TB_PAGEUP, $TB_PAGEDOWN
								$aInfo = GUIGetCursorInfo()
								If (IsArray($aInfo)) And ($aInfo[2]) And ($aInfo[4] = $Slider) Then
									$aRect = _GUICtrlSlider_GetChannelRect($hSlider)
									$aRange = _GUICtrlSlider_GetRange($hSlider)
									If (IsArray($aRect)) And (IsArray($aRange)) Then
										$X = _WinAPI_GetMousePosX(1, $hSlider)
										If $X < $aRect[0] Then
											$X = $aRect[0]
										EndIf
										If $X > $aRect[2] Then
											$X = $aRect[2]
										EndIf
										$Pos = Round(($X - $aRect[0]) / ($aRect[2] - $aRect[0]) * ($aRange[1] - $aRange[0] + 1))
										If $Pos > -1 Then
											_GUICtrlSlider_SetPos($hSlider, $Pos)
										Else
											$Pos = -1
										EndIf
									EndIf
								EndIf
						EndSwitch
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_HSCROLL

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

	Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	Local $hTarget = DllStructGetData($tNMHDR, 'hWndFrom')
	Local $ID = DllStructGetData($tNMHDR, 'Code')

	Switch $hWnd
		Case $hForm
			Switch $hTarget
				Case $hSlider
					Switch $ID
						Case $NM_RELEASEDCAPTURE
							$Pos = -1
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Можно использовать ProgressBar как Slider:
Код:
#include <GuiConstants.au3>
#include <Misc.au3>

$GUI = GuiCreate("Value (0)", 550, 38)
$ProgressBar1 = GuiCtrlCreateProgress(10, 15, 530, 10)
GuiSetState()

While 1
    Switch GuiGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_PRIMARYDOWN
			Do
				_SetValue($ProgressBar1)
				WinSetTitle($GUI, '', 'Value (' & GUICtrlRead($ProgressBar1) & ')')
			Until _IsPressed(1) = 0
    EndSwitch
WEnd

Func _SetValue($iControl)
    $a = GUIGetCursorInfo()
    $cpos = ControlGetPos ('', '', $iControl)
    If $a[4] = $iControl and $a[2] = 1 then GuiCtrlSetdata($iControl, Round(($a[0] / ($cpos[2] /100)) - 2))
EndFunc
 
Верх