Sign in to follow this  
Followers 0
nicdev007

Slider control - jump to next tick

11 posts in this topic

Hi All,

I have created a program that searches a sqlite database and it works great thanks to all the excellent posts I have found from the community. In essence, as the slider is moved, at every movement it queries the Db table and returns a set of variables. The problem here is that the DB does not have corresponding values for each 'tick', thus I want the slider to jump from one tick to the next. For example if I had a tick at 5, 40, 70, and 90 as soon as I move from the tick "0" to the right, I want the mouse to jump to "5" thus skipping 2,3 and 4. Here is a watered down example of what I have done to date without the Sql bits (I added the 'moving right' and 'moving left' messages to show the intent):

#include <GUIConstantsEx.au3>
#include <GuiSlider.au3>
#include <WindowsConstants.au3>
#include <GuiSlider.au3>
#include <SliderConstants.au3>
#include <GuiEdit.au3>
Global $TicArray[5] = [5,30,50,70,90]
Local $oldpos = MouseGetPos(0)
; Create GUI
GUICreate("Slider Set Tic", 400, 296)
$hSlider = GUICtrlCreateSlider(2, 2, 396, 20, BitOR($TBS_TOOLTIPS, $TBS_BOTH, $TBS_ENABLESELRANGE))
$edit = GUICtrlCreateEdit("--",50, 50)
GUISetState()
_GUICtrlSlider_ClearTics($hSlider)
; Set Tics
ArrayTicks($TicArray, $hSlider)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
  Case $GUI_EVENT_CLOSE
  Exit
  Case $hSlider
   While $hSlider
    local $mPos = MouseGetPos(0)
    If $oldpos < $mPos Then
     _GUICtrlEdit_SetText($edit, "moving right")
     ;$oldpos = $mPos
     ;ExitLoop
    ElseIf $oldpos > $mPos Then
     _GUICtrlEdit_SetText($edit, "moving left")
     ;$oldpos = $mPos
     ;ExitLoop
    EndIf
    Sleep(250)
    $oldpos = $mPos
    ExitLoop
   WEnd

EndSwitch
WEnd
; Create array tics
Func ArrayTicks($array, $CurrentSlider)
Local $iMax=UBound($array), $i
For $i = 0 to $iMax - 1
  _GUICtrlSlider_SetTic($CurrentSlider, $array[$i])
Next
EndFunc

Any help will be appreciated;

Thank you

Regards

nicdev


Life is too short to worry about the things you don't have or cannot do ... So if you don't know how to do it - Learn it! Don't be afraid to ask for help ...

Share this post


Link to post
Share on other sites



Here's one way to do it. It jumps from one tick to the next as you move left and right. There is an issue if you drag it with the mouse, rather than clicking on the slider's thumb and scrolling with the mouse wheel or hitting the left and right arrow keys, it will jump around like a cat on a hot tin roof. Probably an easy fix, but this is only a demo anyways. ;)

#include <GUIConstantsEx.au3>
#include <GuiSlider.au3>
#include <WindowsConstants.au3>
#include <GuiSlider.au3>
#include <SliderConstants.au3>
#include <GuiEdit.au3>
Global $TicArray[5] = [5, 30, 50, 70, 90]
Local $oldpos = 0
; Create GUI
GUICreate("Slider Set Tic", 400, 296)
$hSlider = GUICtrlCreateSlider(2, 2, 396, 20, BitOR($TBS_TOOLTIPS, $TBS_BOTH, $TBS_ENABLESELRANGE))
$edit = GUICtrlCreateEdit("--", 50, 50)
GUISetState()
_GUICtrlSlider_ClearTics($hSlider)
; Set Tics
ArrayTicks($TicArray, $hSlider)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
    Global $SliderPos = GUICtrlRead($hSlider)
    If $SliderPos > $oldpos Then
        GUICtrlSetData($edit, "moving right")
        Switch GUICtrlRead($hSlider)
            Case 1 To 5
                GUICtrlSetData($hSlider, 5)
            Case 6 To 30
                GUICtrlSetData($hSlider, 30)
            Case 31 To 50
                GUICtrlSetData($hSlider, 50)
            Case 51 To 70
                GUICtrlSetData($hSlider, 70)
            Case 71 To 90
                GUICtrlSetData($hSlider, 90)
            Case 91 To 100
                GUICtrlSetData($hSlider, 100)
            Case Else
                GUICtrlSetData($hSlider, 0)
        EndSwitch
        $oldpos = GUICtrlRead($hSlider)
    ElseIf $SliderPos < $oldpos Then
        GUICtrlSetData($edit, "moving left")
        Switch GUICtrlRead($hSlider)
            Case 0 To 4
                GUICtrlSetData($hSlider, 0)
            Case 5 To 29
                GUICtrlSetData($hSlider, 5)
            Case 30 To 49
                GUICtrlSetData($hSlider, 30)
            Case 50 To 69
                GUICtrlSetData($hSlider, 50)
            Case 70 To 89
                GUICtrlSetData($hSlider, 70)
            Case 90 To 99
                GUICtrlSetData($hSlider, 90)
            Case Else
                GUICtrlSetData($hSlider, 100)
        EndSwitch

        $oldpos = GUICtrlRead($hSlider)
    EndIf
WEnd
; Create array tics
Func ArrayTicks($array, $CurrentSlider)
    Local $iMax = UBound($array), $i
    For $i = 0 To $iMax - 1
        _GUICtrlSlider_SetTic($CurrentSlider, $array[$i])
    Next
EndFunc   ;==>ArrayTicks
1 person likes this

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

Hi BrewManNH,

Thanks for the reply, and BTW a great idea of how to do it. I never thought of it in that way. I'll try it tomorrow and let you know how it turns out :-) I'm sure we can tame the cat on the hot roof ;-) In think switching on the x -> y of the GUICtrlRead($hSlider) is a good approach.

Thanks again

Goodnight

nicdev


Life is too short to worry about the things you don't have or cannot do ... So if you don't know how to do it - Learn it! Don't be afraid to ask for help ...

Share this post


Link to post
Share on other sites

Here's a new version of the script that uses Windows messaging to read that the control is being moved instead of the GUIGetMsg function, this works pretty good without the jumping around.

#include <GUIConstantsEx.au3>
#include <GuiSlider.au3>
#include <WindowsConstants.au3>
#include <GuiSlider.au3>
#include <SliderConstants.au3>
#include <GuiEdit.au3>
GUIRegisterMsg($WM_HSCROLL, "WM_H_Slider")
Global $TicArray[5] = [5, 30, 50, 70, 90]
Local $oldpos = 0
; Create GUI
GUICreate("Slider Set Tic", 400, 296)
$hSlider = GUICtrlCreateSlider(2, 2, 396, 20, BitOR($TBS_TOOLTIPS, $TBS_BOTH, $TBS_ENABLESELRANGE))
$edit = GUICtrlCreateEdit("--", 50, 50)
GUISetState()
_GUICtrlSlider_ClearTics($hSlider)
; Set Tics
ArrayTicks($TicArray, $hSlider)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
; Create array tics
Func ArrayTicks($array, $CurrentSlider)
    Local $iMax = UBound($array), $i
    For $i = 0 To $iMax - 1
        _GUICtrlSlider_SetTic($CurrentSlider, $array[$i])
    Next
EndFunc   ;==>ArrayTicks
Func WM_H_Slider($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $iValue
    If $lParam = GUICtrlGetHandle($hSlider) Then
        Local $SliderPos = GUICtrlRead($hSlider)
        If $SliderPos > $oldpos Then
            GUICtrlSetData($edit, "moving right")
            Switch GUICtrlRead($hSlider)
                Case 1 To 5
                    GUICtrlSetData($hSlider, 5)
                Case 6 To 30
                    GUICtrlSetData($hSlider, 30)
                Case 31 To 50
                    GUICtrlSetData($hSlider, 50)
                Case 51 To 70
                    GUICtrlSetData($hSlider, 70)
                Case 71 To 90
                    GUICtrlSetData($hSlider, 90)
                Case 91 To 100
                    GUICtrlSetData($hSlider, 100)
                Case Else
                    GUICtrlSetData($hSlider, 0)
            EndSwitch
            $oldpos = GUICtrlRead($hSlider)
        ElseIf $SliderPos < $oldpos Then
            GUICtrlSetData($edit, "moving left")
            Switch GUICtrlRead($hSlider)
                Case 0 To 4
                    GUICtrlSetData($hSlider, 0)
                Case 5 To 29
                    GUICtrlSetData($hSlider, 5)
                Case 30 To 49
                    GUICtrlSetData($hSlider, 30)
                Case 50 To 69
                    GUICtrlSetData($hSlider, 50)
                Case 70 To 89
                    GUICtrlSetData($hSlider, 70)
                Case 90 To 99
                    GUICtrlSetData($hSlider, 90)
                Case Else
                    GUICtrlSetData($hSlider, 100)
            EndSwitch
            $oldpos = GUICtrlRead($hSlider)
        EndIf
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_H_Slider
1 person likes this

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

I think it could be done by some more elegant way through events/messages/API functions.

Now I haven't time to experiment with it but maybe I will try later because it seems like interesting challenge :-)

Here is link to MSDN reference for start:

Slider Notification Messages

http://msdn.microsoft.com/en-us/library/ekx9yz55%28v=vs.80%29.aspx

Slider Control Member Functions

http://msdn.microsoft.com/en-US/library/4ywwzk3e%28v=vs.80%29.aspx

About Trackbar Controls

http://msdn.microsoft.com/en-us/library/...0149%28v=vs.85%29.aspx#Trackba

Trackbar Control Reference

http://msdn.microsoft.com/en-us/library/windows/desktop/ff486103%28v=vs.85%29.aspx

EDIT:

I think TBM_SETTIC message is solution - with this you can add your ticks at specified positions

http://msdn.microsoft.com/en-us/library/windows/desktop/bb760236%28v=vs.85%29.aspx

EDIT2:

sorry I didn't read carefully all posts

BrewManNH in his last did what I had in my mind

Edited by Zedna

Share this post


Link to post
Share on other sites

My only issue with that last entry is it works good when you drag it with the mouse, but it stutters slightly when you use the mouse scroll wheel. It's slight, but noticeable if you scroll the wheel slow enough. I can get one movement method to work well, but it messes up the other method depending upon which one I focused on.


If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

Here's a new version of the script that uses Windows messaging to read that the control is being moved instead of the GUIGetMsg function, this works pretty good without the jumping around.

Hi again, and thanks for the repost :-) I tried your last code, and frankly it really works well. I am not a "mouse roller" on sliders, thus I would probably not even have noticed it. I'm still playing a bit with it to see if I can get it a bit more stable on the mousewheel.

Ciao

nicdev

EDIT: I think it jumps around a lot because we maybe need to update the mouse pointer position at the same time :-)

Edited by nicdev007

Life is too short to worry about the things you don't have or cannot do ... So if you don't know how to do it - Learn it! Don't be afraid to ask for help ...

Share this post


Link to post
Share on other sites

My only issue with that last entry is it works good when you drag it with the mouse, but it stutters slightly when you use the mouse scroll wheel. It's slight, but noticeable if you scroll the wheel slow enough. I can get one movement method to work well, but it messes up the other method depending upon which one I focused on.

Just one small adjustment made it work like a charm :-) No more erratic "cat like" jumping round. thanks for your insights BrewmanNH!!

#include <GUIConstantsEx.au3>
#include <GuiSlider.au3>
#include <WindowsConstants.au3>
#include <GuiSlider.au3>
#include <SliderConstants.au3>
#include <GuiEdit.au3>
GUIRegisterMsg($WM_HSCROLL, "WM_H_Slider")
Global $TicArray[5] = [5, 30, 50, 70, 90]
Local $oldpos = 0
; Create GUI
GUICreate("Slider Set Tic", 400, 296)
$hSlider = GUICtrlCreateSlider(2, 2, 396, 20, BitOR($TBS_TOOLTIPS, $TBS_BOTH, $TBS_ENABLESELRANGE))
$edit = GUICtrlCreateEdit("--", 50, 50)
GUISetState()
_GUICtrlSlider_ClearTics($hSlider)
; Set Tics
ArrayTicks($TicArray, $hSlider)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
; Create array tics
Func ArrayTicks($array, $CurrentSlider)
    Local $iMax = UBound($array), $i
    For $i = 0 To $iMax - 1
        _GUICtrlSlider_SetTic($CurrentSlider, $array[$i])
    Next
EndFunc   ;==>ArrayTicks
Func WM_H_Slider($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $iValue
    If $lParam = GUICtrlGetHandle($hSlider) Then
        Local $SliderPos = GUICtrlRead($hSlider)
        If $SliderPos > $oldpos Then
            GUICtrlSetData($edit, "moving right")
            Switch GUICtrlRead($hSlider)
                Case 1 To 5
                    GUICtrlSetData($hSlider, 5)
                Case 6 To 30
                    GUICtrlSetData($hSlider, 30)
                Case 31 To 50
                    GUICtrlSetData($hSlider, 50)
                Case 51 To 70
                    GUICtrlSetData($hSlider, 70)
                Case 71 To 90
                    GUICtrlSetData($hSlider, 90)
                Case 91 To 100
                    GUICtrlSetData($hSlider, 100)
                Case Else
                    GUICtrlSetData($hSlider, 0)
            EndSwitch
            $oldpos = $SliderPos ; <-- Changed here
        ElseIf $SliderPos < $oldpos Then
            GUICtrlSetData($edit, "moving left")
            Switch GUICtrlRead($hSlider)
                Case 0 To 4
                    GUICtrlSetData($hSlider, 0)
                Case 5 To 29
                    GUICtrlSetData($hSlider, 5)
                Case 30 To 49
                    GUICtrlSetData($hSlider, 30)
                Case 50 To 69
                    GUICtrlSetData($hSlider, 50)
                Case 70 To 89
                    GUICtrlSetData($hSlider, 70)
                Case 90 To 99
                    GUICtrlSetData($hSlider, 90)
                Case Else
                    GUICtrlSetData($hSlider, 100)
            EndSwitch
            $oldpos = $SliderPos  ; <-- Changed here
        EndIf
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_H_Slider

Now putting the idea into the main project to see if the Db queries run as smoothly ;-)

Thanks again for your insights

Best

nicdev


Life is too short to worry about the things you don't have or cannot do ... So if you don't know how to do it - Learn it! Don't be afraid to ask for help ...

Share this post


Link to post
Share on other sites

i had the same problem and i solved it in a different, more "brutal" way. i placed one little button with arrow at each end of the slider. this lets the user decide if he wants to use the slider or the tick step button.

E.


[color=rgb(255,0,0);][font="'comic sans ms', cursive;"]FukuLeaks[/color][/font]

Share this post


Link to post
Share on other sites

Here a another way using windows messaging.

#include <GUIConstantsEx.au3>
#include <GuiSlider.au3>
#include <WindowsConstants.au3>
#include <GuiSlider.au3>

#include <GuiEdit.au3>
Global $TicArray[7] = [0, 5, 30, 50, 70, 90, 100]
Local $oldpos = MouseGetPos(0)
; Create GUI
$hGUI = GUICreate("Slider Set Tic", 400, 296)
$iSlider = GUICtrlCreateSlider(2, 2, 396, 20, BitOR($TBS_TOOLTIPS, $TBS_BOTH, $TBS_ENABLESELRANGE))
$hSlider = GUICtrlGetHandle($iSlider)
$edit = GUICtrlCreateEdit("--", 50, 50)
GUISetState()
_GUICtrlSlider_ClearTics($iSlider)
; Set Tics
ArrayTicks($TicArray, $iSlider)
Global $iSliderPos = 0, $iPos = 0, $iPosOld = -1, $bUpdate = False

GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
;~      Case $iSlider
;~          While $iSlider
;~              Local $mPos = MouseGetPos(0)
;~              If $oldpos < $mPos Then
;~                  _GUICtrlEdit_SetText($edit, "moving right")
;~                  ;$oldpos = $mPos
;~                  ;ExitLoop
;~              ElseIf $oldpos > $mPos Then
;~                  _GUICtrlEdit_SetText($edit, "moving left")
;~                  ;$oldpos = $mPos
;~                  ;ExitLoop
;~              EndIf
;~              Sleep(250)
;~              $oldpos = $mPos
;~              ExitLoop
;~          WEnd

    EndSwitch
WEnd

Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam
    Local $i, $c, $d = 0xFFFFFF, $p
    Switch $lParam
    Case $hSlider
            $iPos = _GUICtrlSlider_GetPos($hSlider)
            For $i = 0 To UBound($TicArray) - 1
                $c = Abs(1 - (($TicArray[$i] + 1) / ($iPos + 1)))
                If $c < $d Then
                    $d = $c
                    $p = $i
                EndIf
            Next
            _GUICtrlSlider_SetPos($hSlider, $TicArray[$p])
    EndSwitch
    Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_HSCROLL

; Create array tics
Func ArrayTicks($array, $CurrentSlider)
    Local $iMax = UBound($array), $i
    For $i = 0 To $iMax - 1
        _GUICtrlSlider_SetTic($CurrentSlider, $array[$i])
    Next
EndFunc   ;==>ArrayTicks
 

I know that the arrow keys are not working this way. Maybe I will find a solution for this...

Br,

UEZ

2 people like this

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

UEZ! Thank you so much. This is what I exactly looking for.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0