Slide bar einstellen aber so das er...

  • Nabend,
    Ich habe ein Problem mit einer Slidebar, undzwar möchte ich das man sie nur auf jeden strich stellen kann (also nur auf 10, 20 ,30 ,40 etc bis 100).

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Test", 275, 103, 193, 125)
    $Slider1 = GUICtrlCreateSlider(8, 8, 265, 49)
    $Button1 = GUICtrlCreateButton("OK", 64, 56, 145, 33, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Switch GUICtrlRead($Slider1)
    Case 10
    MsgBox(0, "", "10")
    Case 20
    MsgBox(0, "", "20")
    Case 30
    MsgBox(0, "", "30")
    Case 40
    MsgBox(0, "", "40")
    Case 50
    MsgBox(0, "", "50")
    Case 60
    MsgBox(0, "", "60")
    Case 70
    MsgBox(0, "", "70")
    Case 80
    MsgBox(0, "", "80")
    Case 90
    MsgBox(0, "", "90")
    Case 100
    MsgBox(0, "", "100")
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]


    Wie funktioniert das?
    mfg kangtar

    • Offizieller Beitrag

    Hier guckst du :

    Spoiler anzeigen
    [autoit]

    #include <GuiSlider.au3>
    #include <GUIConstantsEx.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Test", 275, 103, 193, 125)
    $Slider1 = GUICtrlCreateSlider(8, 8, 265, 49)
    $hSlider = GUICtrlGetHandle($Slider1)
    $Button1 = GUICtrlCreateButton("OK", 64, 56, 145, 33, 0)
    _GUICtrlSlider_SetPageSize($hSlider,10)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Switch GUICtrlRead($Slider1)
    Case 10
    MsgBox(0, "", "10")
    Case 20
    MsgBox(0, "", "20")
    Case 30
    MsgBox(0, "", "30")
    Case 40
    MsgBox(0, "", "40")
    Case 50
    MsgBox(0, "", "50")
    Case 60
    MsgBox(0, "", "60")
    Case 70
    MsgBox(0, "", "70")
    Case 80
    MsgBox(0, "", "80")
    Case 90
    MsgBox(0, "", "90")
    Case 100
    MsgBox(0, "", "100")
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]
  • Hallo Katangar,

    ich würde es so lösen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <SliderConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $iPercent

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $hGui = GUICreate("Test", 275, 103, 193, 150)
    $hSlider = GUICtrlCreateSlider(8, 8, 265, 49,BitOR($GUI_SS_DEFAULT_SLIDER,$TBS_BOTH,$TBS_AUTOTICKS))
    GUICtrlSetLimit($hSlider, 100, 10) ;maximal 100 minimal 10
    $Button1 = GUICtrlCreateButton("OK", 64, 56, 145, 33, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hSlider
    $iPercent = Round(GUICtrlRead($hSlider) / 10) * 10 ;Sliderwert auf 10er Zahlen runden
    GUICtrlSetData($hSlider,$iPercent) ;gerundeten Wert anzeigen
    Case $Button1
    ;$iPercent = Int(GUICtrlRead($hSlider) / 10)
    Switch $iPercent
    Case 10
    MsgBox(0, "", "10")
    Case 20
    MsgBox(0, "", "20")
    Case 30
    MsgBox(0, "", "30")
    Case 40
    MsgBox(0, "", "40")
    Case 50
    MsgBox(0, "", "50")
    Case 60
    MsgBox(0, "", "60")
    Case 70
    MsgBox(0, "", "70")
    Case 80
    MsgBox(0, "", "80")
    Case 90
    MsgBox(0, "", "90")
    Case 100
    MsgBox(0, "", "100")
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]

    Raupi bei deiner Lösung kann ich Zwischenwerte einstellen,

    mfg (Auto)Bert

    • Offizieller Beitrag

    autoBert. Deine Lösung ist aber auch nicht das gelbe vom Ei. Wenn du bei 10 drückst springt er auf 20 und beim 2. mal auf 0 . Steht der Slider auf 100 und du klickst auf 10 dann springt er auf 80 und bei weiteren klicken immer 20 weniger .

  • Nabend,
    Danke für deine Antwort. Kann man es auch so machen das er nur bei den strichen stehen bleibt und nicht dazwischen? (das were das was ich brauchen würde)
    mfg Kangtar

    • Offizieller Beitrag

    Hab das ganze jetzt mal umgebaut, 8ich denke so wolltest du es.

    Spoiler anzeigen
    [autoit]

    #include <GuiSlider.au3>
    #include <GUIConstantsEx.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Test", 275, 103, 193, 125)
    $Slider1 = GUICtrlCreateSlider(8, 8, 265, 49)
    $hSlider = GUICtrlGetHandle($Slider1)
    $Button1 = GUICtrlCreateButton("OK", 64, 56, 145, 33, 0)
    _GUICtrlSlider_SetTicFreq($hSlider, 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetLimit($Slider1, 10, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Switch GUICtrlRead($Slider1)*10
    Case 10
    MsgBox(0, "", "10")
    Case 20
    MsgBox(0, "", "20")
    Case 30
    MsgBox(0, "", "30")
    Case 40
    MsgBox(0, "", "40")
    Case 50
    MsgBox(0, "", "50")
    Case 60
    MsgBox(0, "", "60")
    Case 70
    MsgBox(0, "", "70")
    Case 80
    MsgBox(0, "", "80")
    Case 90
    MsgBox(0, "", "90")
    Case 100
    MsgBox(0, "", "100")
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]
    • Offizieller Beitrag

    Na das geht aber schöner ;)

    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    $Form1 = GUICreate("Test", 275, 103, 193, 125)
    $Slider1 = GUICtrlCreateSlider(8, 8, 265, 49)
    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

    [/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom,$iCode, $tNMHDR, $hWndSlider, $val
    $hWndSlider = $Slider1
    If Not IsHWnd($hWndSlider) Then $hWndSlider = GUICtrlGetHandle($hWndSlider)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    If $hWndFrom = $hWndSlider And $iCode = -16 Then
    GUICtrlSetData($Slider1, Ceiling(GUICtrlRead($Slider1) / 10)*10)
    EndIf
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    BugFix . Versuch mal den 1. Teilstrich zu klicken. Es wird immer nur jeder 2. Teilstrich ausgewählt.Wenn ich auf den 3. Teilstrich klicke wird abwechselnd der 2. oder 4. ausgewählt.Ist das bei dir auch so ? Oder ist das wieder mal ein dummer Vista Fehler ?

    • Offizieller Beitrag

    Oder ist das wieder mal ein dummer Vista Fehler ?

    Gut möglich, in XP klappt es wie vom Threadstarter gewünscht ==> wenn du den Slider zwischen 2 Striche ziehst, wandert er zum nächst höheren. (Ziehst du ihn genau auf einen Strich, bleibt er natürlich dort)

    Edit:
    Ich weiß jetzt, was du meinst ==> mit der Maus einfach in den Slider klicken, da bekommst du bei 10er Skalierung immer nur jeden zweiten Strich, das ist völlig normal.

    • Offizieller Beitrag

    Hm, schein ein Vista Problem zu sein . Wenn ich den Slider verschiebe, dann wird korrekt der nächste Teilstrich ausgewäht. Wenn man aber eine klick irgendwo auf den Slider nacht wird immer 2 Teilstriche gesprungen .

    Edit : BugFix hab dein Edit zu spät gesehen :D

  • Hallo

    habe mich auch nur auf das Sliden konzentriert und das klicken dabei völlig ignoriert, hier eine Lösung die nach meinem Erachten der beste Kompromiss ist. Getestet mit XP

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <SliderConstants.au3>
    #Include <GuiSlider.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $iPercent

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $hGui = GUICreate("Test", 275, 145, 193, 150)
    $hGroup = GUICtrlCreateGroup("Der Wert beträgt jetzt: 0%.",8,8,260,79)
    $hSlider = GUICtrlCreateSlider(13, 23, 250, 49,BitOR($GUI_SS_DEFAULT_SLIDER,$TBS_Bottom,$TBS_ENABLESELRANGE,$TBS_TOOLTIPS))
    GUICtrlSetLimit($hSlider, 100, 0) ;maximal 100 minimal 0
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; Gruppe schliessen
    $Button1 = GUICtrlCreateButton("OK", 64, 96, 145, 33, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    _GUICtrlSlider_SetPageSize($hSlider,10)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hSlider
    $iPercent = Ceiling(GUICtrlRead($hSlider) / 10) * 10 ;Sliderwert auf 10er Zahlen runden
    GUICtrlSetData($hSlider,$iPercent) ;gerundeten Wert anzeigen
    GUICtrlSetData($hGroup,"Der Wert beträgt jetzt: " & $iPercent & "%.")
    Case $Button1
    ;$iPercent = Int(GUICtrlRead($hSlider) / 10)
    Switch $iPercent
    Case 10
    MsgBox(0, "", "10")
    Case 20
    MsgBox(0, "", "20")
    Case 30
    MsgBox(0, "", "30")
    Case 40
    MsgBox(0, "", "40")
    Case 50
    MsgBox(0, "", "50")
    Case 60
    MsgBox(0, "", "60")
    Case 70
    MsgBox(0, "", "70")
    Case 80
    MsgBox(0, "", "80")
    Case 90
    MsgBox(0, "", "90")
    Case 100
    MsgBox(0, "", "100")
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]


    Anstelle von Round verwende ich jetzt auch Ceiling wie BugFix , zusätzlich habe ich _SetPageSize eingebaut wie Raupi . Zur Kontrolle während des Sliden's habe ich zusätzlich $TBS_TOOLTIPS als Stil aufgenommen. Zur Kontrolle nach dem Sliden zeige ich die Prozentzahl als Group-Text an.

    PS.: man muss beim klicken etwas länger die Maustaste gedrückt halten,

    Edit 2 überflüssige Zeilen entfernt

    mfg (Auto)Bert

    2 Mal editiert, zuletzt von AutoBert (22. Juni 2009 um 23:52)

    • Offizieller Beitrag

    Im OnEvent-Mode läßt sich das noch etwas straffen. Allerdings ist nach wie vor das Problem des Hineinklickens.
    Hier habe ich jetzt noch etwas verfeinert, sodass beim Ziehen des Sliders zwischen zwei Strichen je nach Position auf- oder abgerundet wird auf den nächsten/vorigen 10er Wert.

    [autoit]

    #include <GUIConstants.au3>
    #include <GuiSlider.au3>
    Opt('GUIOnEventMode', 1)

    [/autoit][autoit][/autoit][autoit]

    $Form1 = GUICreate("Test", 275, 103, 193, 125)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_end')
    $Slider1 = GUICtrlCreateSlider(8, 8, 265, 49, BitOR($TBS_AUTOTICKS,$TBS_ENABLESELRANGE))
    GUICtrlSetOnEvent(-1, '_slider')
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func _end()
    Exit
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _slider()
    GUICtrlSetData($Slider1, _GetRound(Round(GUICtrlRead($Slider1)/10,1))*10)
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _GetRound($val)
    Local $d = Int($val/0.5)
    If Mod($d, 2) Then $d += 1
    Return $d/2
    EndFunc

    [/autoit]
  • Hallo BugFix ,

    wenn du noch diese Zeile:

    [autoit]

    _GUICtrlSlider_SetPageSize($hSlider,10)

    [/autoit]

    rein nimmst, dann springt er beim reinklicken nur noch zwischen den nächst höheren bzw. niederen Wert hin und her, wenn man zwischen 2 Werten immer wieder auf die gleiche Stelle klickt.

    mfg (Auto)Bert