Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Управление слайдером (http://forum.oszone.net/showthread.php?t=142808)

gregaz 16-06-2009 14:02 1144672

Управление слайдером
 
Как правильно организовать управление слайдером ?

Почему при клике в теле слайдера движок не устанавливается точно в кликнутую позицию ,а проскакивает ее ?

Необходимо установить движок слайдера в кликнутую позицию и получить ее координаты.
Код:

#include <GUIConstants.au3> 
$hGUI = GuiCreate('Test',660, 200)   
Opt("GUIOnEventMode", 1)   
GUISetOnEvent($GUI_EVENT_CLOSE, "quit")   
$slider = GUICtrlCreateSlider(10, 130, 630, 25 )   
GUICtrlSetOnEvent( -1, "Sl")   
GUISetState(@SW_SHOW)   
While 1         
    Sleep(100) 
WEnd   
Func quit()     
    Exit 
EndFunc 
Func Sl()         
    $read=GUICtrlRead($slider,1)         
    ConsoleWrite( $read & @crlf) 
EndFunc

Вопрос простой
Похоже решение тоже простое , но я не нашел .

morgan1991 17-06-2009 14:57 1145078

gregaz, можно отловить нажатие левой кнопки мыши (это было на форуме, поиск), затем считать координаты мыши относительно окна и исходя из них передвинуть слайдер, затем считать его расположение.

gregaz 17-06-2009 16:42 1145200

morgan1991, Спасибо
Извиняюсь ,что не сразу воспользовался поиском.
Правда не совсем понятно как считать точную позицию движка
Кликну на 25 - он все равно даст 20 (частота дискретицации?)
Повторный клик на 25 дает 40 и т.д. 20,40,20,40 ? (в примере от Yashied : Yashied )

Там была проблема предачи в скрипт позиции движка.
А здесь-получение этой позиции при клике ?

morgan1991 17-06-2009 21:32 1145434

gregaz, а зачем для считывания позиции использовать расширенный режим?

Код:

$read=GUICtrlRead($slider,1)
Может сделать так:

Код:

$read=GUICtrlRead($slider)
Проблема в этом?

gregaz 18-06-2009 09:46 1145733

Цитата:

Цитата morgan1991
gregaz, а зачем для считывания позиции использовать расширенный режим? »

Да разницы то ведь нет .
Даже используя _GUICtrlSlider_GetPos($Slider) все равно не получить точную координату скажем 23 (будет 20, следующий клик там же - 40 и т.д. 20-40-20-40...)
Вопрос : как установить движок точно в кликнутое место ?
Можно как-то уменьшить частоту дискретизации (здесь 20) ?

morgan1991 18-06-2009 10:41 1145771

gregaz,
А так не пробовали?
Код:

#include <GUIConstants.au3>

$gui = GUICreate("slider",220,100, 100,200)
GUISetBkColor (0x00E0FFFF)  ; will change background color

$slider1 = GUICtrlCreateSlider (0,10,220,20)
GUICtrlSetLimit(-1,200, 0)  ; change min/max value
$button = GUICtrlCreateButton ("Value?",75,70,70,20)
GUISetState()
GUICtrlSetData($slider1,45) ; set cursor

$start=TimerInit()
Do
  $n = GUIGetMsg ()

  If $n = $button Then
      MsgBox(0,"slider1",GUICtrlRead($slider1),2)
  $start=TimerInit()
  EndIf
  If
$n = $slider1 Then
      $pos = GUIGetCursorInfo($gui)
      GUICtrlSetData($slider1, $pos[0]-10)
  EndIf
Until
$n = $GUI_EVENT_CLOSE

Только ещё бы отключить стандартный сдвиг ползунка....

gregaz 18-06-2009 15:02 1145989

morgan1991 , Спасибо
Вообще то это мне и требовалось.
Решение действительно простое
Цитата:

Цитата morgan1991
Только ещё бы отключить стандартный сдвиг ползунка.... »

От этого трудно избавиться , да и вряд ли это принципиально важно.

Yashied 19-06-2009 10:05 1146541

Цитата:

Цитата gregaz
От этого трудно избавиться , да и вряд ли это принципиально важно. »

Попробуй так.

Код:

#Include <GUISlider.au3>

Global $Form, $Slider, $Data, $Release = False

$Form = GUICreate('Test', 220, 100)
$Slider = GUICtrlCreateSlider(0, 10, 220, 20)
GUICtrlSetLimit(-1, 200, 0)
_GUICtrlSlider_SetPageSize($Slider, 0)
GUISetState()

Do
    $Data = GUIGetCursorInfo()
    Switch $Data[4]
        Case $Slider
            If $Data[2] Then
                If
$Release Then
                    GUICtrlSetData($Slider, $Data[0] - 10)
                    $Release = False
                EndIf
            Else
                $Release = True
            EndIf
    EndSwitch
Until GUIGetMsg() = -3


gregaz 19-06-2009 23:28 1147233

Yashied, спасибо .
Очень интересное решение .
Надо попробовать использовать .


Время: 07:56.

Время: 07:56.
© OSzone.net 2001-