Что нового

как позиционировать ползунок (slider) в позицию клика мышки?

weweWe45s

Новичок
Сообщения
36
Репутация
1
подскажите как позиционировать $slider в позицию клика мышки?
т.е. сделать так что бы элемент $slider переходил в позицию (принимал значение) где произошло событие "клик мышки"
(конечно если клик происходит в этом элементе $slider) а то у меня получается то недолет то перлет

зы поиск на форуме не работает (
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: как позиционировать $slider в позицию клика мышки?

weweWe45s [?]
подскажите как позиционировать $slider в позицию клика мышки?
Это переменная, по видимому как-то связанная с Slider Control. Как можно позиционировать переменную?

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"как позиционировать $slider в позицию клика мышки?" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Глобальный модератор.
 
Автор
W

weweWe45s

Новичок
Сообщения
36
Репутация
1
Garrett - тему переименовал

InnI - спасибо проблема решена ) вроде ...
немного переделал код от Zaramot

Код:
#include <GUIConstantsEx.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiSlider.au3>
#include <ScrollBarConstants.au3>

#Region gui
$max = 12345
$min = 0
$hwin = GUICreate("Test", 550, 100)
$Slider1 = GUICtrlCreateSlider(10, 7, 530, 25, $TBS_NOTICKS)
_GUICtrlSlider_SetRange($Slider1, $min, $max)
_GUICtrlSlider_SetPageSize($Slider1, 0)
GUISetState(@SW_SHOW)
#EndRegion gui

$test_num = 0

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_PRIMARYDOWN
			$test_num += 1
			ConsoleWrite($test_num & " _ " & _SetValue($Slider1, $hwin, $min, $max) & " `` " & _GUICtrlSlider_GetPos($Slider1) & @CRLF);test
	EndSwitch
WEnd

Func _SetValue($iControl, $iwin, $imin, $imax)
	$a = GUIGetCursorInfo($iwin)
	$cpos = ControlGetPos('', '', $iControl)
	$corect = _GUICtrlSlider_GetThumbLength($iControl)
	$its_pos = "not"
	If $a[4] = $iControl And $a[2] = 1 Then
		$its_pos = ($a[0] - $corect) / (($cpos[2] - $corect) / $imax)
		If $its_pos > $imax Then $its_pos = $imax
		If $its_pos < $imin Then $its_pos = $imin
		_GUICtrlSlider_SetPos($iControl, $its_pos)
		Return _GUICtrlSlider_GetPos($iControl)
	EndIf
EndFunc   ;==>_SetValue


в сомнениях по поводу правильно ли использовать для коррекции
(типа отступ в пикселях от рамки слайдера до начала ползунка) _GUICtrlSlider_GetThumbLength($iControl)?

зы при клике вне контола слайдера выдает ноль ( первой цифрой
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
weweWe45s
в сомнениях по поводу
Не могу развеять ваши сомнения - в тонкостях работы слайдера не разбираюсь.
Найти решённую тему при неработающем поиске - это тоже помощь ;)

при клике вне контрола слайдера выдает ноль
Это потому, что вы не обрабатываете ситуацию, когда клик НЕ по слайдеру, и функция возвращает ноль
Код:
Return _GUICtrlSlider_GetPos($iControl)
    Else
        Return $its_pos ; вернёт "not"
    EndIf
 
Автор
W

weweWe45s

Новичок
Сообщения
36
Репутация
1
спасибо ) а то я бы так и продолжал бы слоупочить закрываю как решено
кстати по поводу размеров элементов в виндовс итд
нашел функцию _WinAPI_GetSystemMetrics идексы для нее можно посмотреть здесь

исправленая версия скрипта с учетом замечаний InnI и использованием для коррекции _WinAPI_GetSystemMetrics($i)

Код:
#include <GUIConstantsEx.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiSlider.au3>
#include <ScrollBarConstants.au3>

#Region gui
$max = 12345
$min = 0
$hwin = GUICreate("Test", 550, 100)
$Slider1 = GUICtrlCreateSlider(10, 7, 530, 25, $TBS_NOTICKS)
_GUICtrlSlider_SetRange($Slider1, $min, $max)
_GUICtrlSlider_SetPageSize($Slider1, 0)
GUISetState(@SW_SHOW)
#EndRegion gui

$test_num = 0

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_PRIMARYDOWN
            $test_num += 1
            ConsoleWrite($test_num & " _ " & _SetValue($Slider1, $hwin, $min, $max) _
			& " `` " & _GUICtrlSlider_GetPos($Slider1) & @CRLF);test
    EndSwitch
WEnd

Func _SetValue($iControl, $iwin, $imin, $imax)
    $a = GUIGetCursorInfo($iwin)
    $cpos = ControlGetPos('', '', $iControl)
    $corect = _WinAPI_GetSystemMetrics(21)
	;или $corect = _GUICtrlSlider_GetThumbLength($iControl)
    $its_pos = "not"
    If $a[4] = $iControl And $a[2] = 1 Then
        $its_pos = ($a[0] - $corect) / (($cpos[2] - $corect) / $imax)
        If $its_pos > $imax Then $its_pos = $imax
        If $its_pos < $imin Then $its_pos = $imin
        _GUICtrlSlider_SetPos($iControl, $its_pos)
        Return _GUICtrlSlider_GetPos($iControl)
    Else
        Return $its_pos ; вернёт "not"
    EndIf
EndFunc   ;==>_SetValue


зы максимально возможный диапазон слайдера от 0 до 32767
 
Верх