Что нового

Часы/время для установки времени с чекбоксом аналогично $DTS_SHOWNONE в календаре

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток и с праздником св.Николая. Не могу придумать часы для установки времени по типу календаря с чекбоксом, если прописать $DTS_SHOWNONE для проверки. Добавление в эту строку:
Код:
$idTimeS = GUICtrlCreateDate("12:00:00", 270, 10, 70, 25, $DTS_TIMEFORMAT)
либо ничего не дает, либо превращает в календарь.
В другой теме CreatoR предложил для других целей вариант со слайдером (ползунком) но все равно не могу прикрутить туда чекбокс.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
$idTimeS = GUICtrlCreateDate("12:00:00", 270, 10, 100, 25, BitOR($DTS_SHOWNONE, $DTS_TIMEFORMAT))

Или я чего то не понял...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <GUIConstantsEx.au3>
#include <GUIDateTimePicker.au3>

Global $tDate = DllStructCreate($tagSYSTEMTIME)

DllStructSetData($tDate, "Year", @YEAR)
DllStructSetData($tDate, "Month", 1)
DllStructSetData($tDate, "Day", 1)
DllStructSetData($tDate, "Hour", 12)
DllStructSetData($tDate, "Minute", 0)
DllStructSetData($tDate, "Second", 0)

$hGUI = GUICreate('')

$idTimeS = GUICtrlCreateDate('', 270, 10, 100, 25, BitOR($DTS_SHOWNONE, $DTS_TIMEFORMAT))
$hTime = GUICtrlGetHandle($idTimeS)

_GUICtrlDTP_SetSystemTimeEx($hTime, $tDate, False)
_GUICtrlDTP_SetSystemTimeEx($hTime, $tDate, True)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
BitOR($DTS_SHOWNONE, $DTS_TIMEFORMAT)
То, что нужно )
Сообщение автоматически объединено:

$idTimeS = GUICtrlCreateDate('', 270, 10, 100, 25, BitOR($DTS_SHOWNONE, $DTS_TIMEFORMAT))
Небольшое уточнение, если можно. Как установить формат времени в этой ситуации, чтоб часы и минуты показывали не 0 часов 7 мин, а 00 часов 07 мин (тоесть вот так 00:07:05)
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
чтоб часы и минуты показывали не 0 часов 7 мин, а 00 часов 07 мин (тоесть вот так 00:07:05)
Ну вообще оно показывает так, как установлено в системе.
Это можно обойти так:
Код:
Local $sStyle = 'HH:mm:ss'
GUICtrlSendMsg($idTimeS, $DTM_SETFORMATW, 0, $sStyle)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
вариант со слайдером (ползунком) но все равно не могу прикрутить туда чекбокс.
Вот сделал небольшую библиотеку:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Date.au3>

Global Enum $iSliderTime_hWnd, $iSliderTime_Slider, $iSliderTime_Label, _
    $iSliderTime_Total
Global $aSliderTime[1][$iSliderTime_Total]

$hGUI = GUICreate('_GUICtrlSliderTime_Create', 220, 200)

$iTime1_CB = GUICtrlCreateCheckbox('Time 1:', 10, 20)
$iSliderTime1 = _GUICtrlSliderTime_Create($hGUI, 10, 40, 200, 20, '00:00')
_GUICtrlSliderTime_SetTime($iSliderTime1, '12:00')
_GUICtrlSliderTime_SetState($iSliderTime1, $GUI_DISABLE)

$iTime2_CB = GUICtrlCreateCheckbox('Time 2:', 10, 100)
$iSliderTime2 = _GUICtrlSliderTime_Create($hGUI, 10, 120, 200, 20, '00:00')
_GUICtrlSliderTime_SetTime($iSliderTime2, '15:00')
_GUICtrlSliderTime_SetState($iSliderTime2, $GUI_DISABLE)

GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iTime1_CB
            _GUICtrlSliderTime_SetState($iSliderTime1, (GUICtrlRead($iTime1_CB) = $GUI_CHECKED ? $GUI_ENABLE : $GUI_DISABLE))
        Case $iTime2_CB
            _GUICtrlSliderTime_SetState($iSliderTime2, (GUICtrlRead($iTime2_CB) = $GUI_CHECKED ? $GUI_ENABLE : $GUI_DISABLE))
    EndSwitch
WEnd

Func _GUICtrlSliderTime_Create($hWnd, $iLeft, $iTop, $iWidth = -1, $iHeight = -1, $sTime = Default)
    If $sTime == Default Then
        $sTime = @HOUR & ':' & @MIN
    EndIf
    
    If $aSliderTime[0][0] = 0 Then
        GUIRegisterMsg($WM_HSCROLL, '__GUICtrlSliderTime_WM_HSCROLL')
    EndIf
    
    $aSliderTime[0][0] += 1
    ReDim $aSliderTime[$aSliderTime[0][0] + 1][$iSliderTime_Total]
    
    $aSliderTime[$aSliderTime[0][0]][$iSliderTime_hWnd] = $hWnd
    $aSliderTime[$aSliderTime[0][0]][$iSliderTime_Slider] = GUICtrlCreateSlider($iLeft, $iTop, $iWidth, $iHeight)
    $aSliderTime[$aSliderTime[0][0]][$iSliderTime_Label] = GUICtrlCreateLabel($sTime, $iLeft, $iTop + ($iHeight = -1 ? 30 : $iHeight))
    
    GUICtrlSetLimit($aSliderTime[$aSliderTime[0][0]][$iSliderTime_Slider], 1440, 0)
    _GUICtrlSliderTime_SetTime($aSliderTime[0][0], $sTime)
    
    Return $aSliderTime[0][0]
EndFunc

Func _GUICtrlSliderTime_SetTime($iSliderTime, $sTime = '')
    Local $iST_ID = 0
    
    For $iID = 1 To $aSliderTime[0][0]
        If $iID = $iSliderTime Then
            $iST_ID = $iSliderTime
        EndIf
    Next
    
    If Not $iST_ID Then
        Return SetError(1, 0, 0)
    EndIf
    
    If $sTime = '' Then
        Local $iHours, $iMins, $iSecs
        
        $sTime = GUICtrlRead($aSliderTime[$iSliderTime][$iSliderTime_Slider])
        $sTime = _TicksToTime($sTime * 60 * 1000, $iHours, $iMins, $iSecs)
        $sTime = StringFormat('%02i:%02i', $iHours, $iMins)
    Else
        Local $aTime = StringSplit($sTime, ':')
        GUICtrlSetData($aSliderTime[$iSliderTime][$iSliderTime_Slider], (_TimeToTicks($aTime[1], $aTime[2], 0) / 60 /1000))
    EndIf
    
    GUICtrlSetData($aSliderTime[$iSliderTime][$iSliderTime_Label], $sTime)
EndFunc

Func _GUICtrlSliderTime_SetState($iSliderTime, $iState)
    For $iID = 1 To $aSliderTime[0][0]
        If $iID = $iSliderTime Then
            GUICtrlSetState($aSliderTime[$iSliderTime][$iSliderTime_Slider], $iState)
            GUICtrlSetState($aSliderTime[$iSliderTime][$iSliderTime_Label], $iState)
            ExitLoop
        EndIf
    Next
EndFunc

Func __GUICtrlSliderTime_WM_HSCROLL($hWnd, $iMsg, $wParam, $lParam)
    For $i = 1 To $aSliderTime[0][0]
        If $lParam = GUICtrlGetHandle($aSliderTime[$i][$iSliderTime_Slider]) Then
            _GUICtrlSliderTime_SetTime($i)
            ExitLoop
        EndIf
    Next
    
    Return $GUI_RUNDEFMSG
EndFunc
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Вот сделал небольшую библиотеку:
Попробовал сделать ползунок вертикальным и выпадающим. Развернуть-то получилось, а вот настройки времени слетели. И ноль получился сверху. Выпадающим тоже пока не получается. Делаю так:
Код:
$aSliderTime[$aSliderTime[0][0]][$iSliderTime_Slider] = GUICtrlCreateSlider($iLeft, $iTop, $iWidth, $iHeight, BitOR($TBS_AUTOTICKS, $TBS_BOTH, $TBS_TOOLTIPS, $TBS_VERT, $WS_TABSTOP))

Сообщение автоматически объединено:

Это можно обойти так:
Оно конечно помогло обойти и отображает двузначным, но вот считывает все равно без нуля. Я то его потом добавляю, но хотелось бы сразу получать в нужном формате.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Попробовал сделать ползунок вертикальным и выпадающим
Что значит выпадающим?
Для вертикального нужно также регистрировать и $WM_VSCROLL.
Позже попробую сделать флаг для этого.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Позже попробую сделать флаг для этого
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <SliderConstants.au3>
#include <Date.au3>

;Align for horizontal slider
Global Enum _
    $STIME_ALIGN_LEFTBOTTOM, _ ;Align time label to the left bottom corner of slider control
    $STIME_ALIGN_RIGHTBOTTOM, _ ;Align time label to the right bottom corner of the slider control
    $STIME_ALIGN_LEFT, _ ;Align time label to the left side of the slider control
    $STIME_ALIGN_RIGHT, _ ;Align time label to the right side of the slider control
    $STIME_ALIGN_LEFTTOP, _ ;Align time label to the left top corner of the slider control
    $STIME_ALIGN_RIGHTTOP ;Align time label to the right top corner of the slider control

;Align for vertical slider
Global Enum _
    $STIME_ALIGN_TOP, _ ;Align time label to the top of slider control
    $STIME_ALIGN_BOTTOM ;Align time label to the bottom of slider control

Global Enum $iSTime_hWnd, $iSTime_Slider, $iSTime_Label, _
    $iSTime_Total
Global $aSTime[1][$iSTime_Total]

Global Const $sSTime_Delim = __GUICtrlSliderTime_GetTimeDelim(_NowTime())

$hGUI = GUICreate('_GUICtrlSliderTime_Create', 220, 330)

$iTime1_CB = GUICtrlCreateCheckbox('Time 1:', 10, 20, -1, 20)
$iSliderTime1 = _GUICtrlSliderTime_Create($hGUI, 10, 50, 25, 180, '00:00', $STIME_ALIGN_TOP, True)
_GUICtrlSliderTime_SetTime($iSliderTime1, '12:00')
_GUICtrlSliderTime_SetState($iSliderTime1, $GUI_DISABLE)

$iTime2_CB = GUICtrlCreateCheckbox('Time 2:', 10, 250, -1, 20)
GUICtrlSetState($iTime2_CB, $GUI_CHECKED)
$iSliderTime2 = _GUICtrlSliderTime_Create($hGUI, 10, 270, 200, 20, '', $STIME_ALIGN_RIGHTBOTTOM, False)
;~ _GUICtrlSliderTime_SetTime($iSliderTime2, '20:00')

GUISetState(@SW_SHOW, $hGUI)

While 1
    $iMsg = GUIGetMsg()
    
    Switch $iMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iTime1_CB, $iTime2_CB
            _GUICtrlSliderTime_SetState( _
                ($iMsg = $iTime1_CB ? $iSliderTime1 : $iSliderTime2), _
                (GUICtrlRead($iMsg) = $GUI_CHECKED ? $GUI_ENABLE : $GUI_DISABLE))
    EndSwitch
WEnd

Func _GUICtrlSliderTime_Create($hWnd, $iLeft, $iTop, $iWidth, $iHeight = -1, $sTime = Default, $iAlign = 0, $fVert = False)
    $sTime = StringReplace($sTime, ':', $sSTime_Delim)
    
    If Not __GUICtrlSliderTime_IsValidTime($sTime) Then
        $sTime = @HOUR & $sSTime_Delim & @MIN
    EndIf
    
    If $aSTime[0][0] = 0 Then
        GUIRegisterMsg($WM_HSCROLL, '__GUICtrlSliderTime_WM_HVSCROLL')
        GUIRegisterMsg($WM_VSCROLL, '__GUICtrlSliderTime_WM_HVSCROLL')
    EndIf
    
    If $iHeight == Default Or $iHeight = -1 Then
        $iHeight = 20
    EndIf
    
    Local $iLbl_Left = $iLeft, $iLbl_Top = $iTop
    Local $iStyle = $TBS_AUTOTICKS
    
    If $fVert Then
        Switch $iAlign
            Case $STIME_ALIGN_BOTTOM
                $iLbl_Left = $iLeft
                $iLbl_Top = ($iTop + $iHeight)
            Case Else ;$STIME_ALIGN_TOP
                $iTop += 15
        EndSwitch
        
        $iStyle = BitOR($iStyle, $TBS_VERT, $TBS_BOTH)
    Else
        Switch $iAlign
            Case $STIME_ALIGN_RIGHTBOTTOM
                $iLbl_Left = ($iWidth - 22)
                $iLbl_Top = ($iTop + $iHeight)
            Case $STIME_ALIGN_LEFT
                $iWidth -= 30
                $iLbl_Left = $iLeft
                $iLeft += 30
                $iLbl_Top = $iTop
            Case $STIME_ALIGN_RIGHT
                $iWidth -= 30
                $iLbl_Left = ($iLeft + $iWidth)
                $iLbl_Top = $iTop
            Case $STIME_ALIGN_LEFTTOP
                $iLbl_Left = $iLeft
                $iLbl_Top = $iTop
                $iTop += 15
            Case $STIME_ALIGN_RIGHTTOP
                $iLbl_Left = ($iWidth - 22)
                $iLbl_Top = $iTop
                $iTop += 15
            Case Else ;$STIME_ALIGN_LEFTBOTTOM
                $iLbl_Left = ($iLeft + 5)
                $iLbl_Top = ($iTop + $iHeight)
        EndSwitch
    EndIf
    
    $aSTime[0][0] += 1
    ReDim $aSTime[$aSTime[0][0] + 1][$iSTime_Total]
    
    $aSTime[$aSTime[0][0]][$iSTime_hWnd] = $hWnd
    $aSTime[$aSTime[0][0]][$iSTime_Slider] = GUICtrlCreateSlider($iLeft, $iTop, $iWidth, $iHeight, $iStyle)
    $aSTime[$aSTime[0][0]][$iSTime_Label] = GUICtrlCreateLabel($sTime, $iLbl_Left, $iLbl_Top, 30, 15)
    
    GUICtrlSetLimit($aSTime[$aSTime[0][0]][$iSTime_Slider], 1440, 0)
    _GUICtrlSliderTime_SetTime($aSTime[0][0], $sTime)
    
    Return $aSTime[0][0]
EndFunc

Func _GUICtrlSliderTime_SetTime($iSTime, $sTime = '')
    Local $iST_ID = 0
    
    For $iID = 1 To $aSTime[0][0]
        If $iID = $iSTime Then
            $iST_ID = $iSTime
        EndIf
    Next
    
    If Not $iST_ID Then
        Return SetError(1, 0, 0)
    EndIf
    
    $sTime = StringReplace($sTime, ':', $sSTime_Delim)
    
    If __GUICtrlSliderTime_IsValidTime($sTime) Then
        Local $aTime = StringSplit($sTime, $sSTime_Delim)
        GUICtrlSetData($aSTime[$iSTime][$iSTime_Slider], (_TimeToTicks($aTime[1], $aTime[2], 0) / 60 / 999.9))
    Else
        Local $iHours, $iMins, $iSecs
        
        $sTime = GUICtrlRead($aSTime[$iSTime][$iSTime_Slider])
        $sTime = _TicksToTime($sTime * 60 * 999.9, $iHours, $iMins, $iSecs)
        $sTime = StringFormat('%02i' & $sSTime_Delim & '%02i', $iHours, $iMins)
    EndIf
    
    GUICtrlSetData($aSTime[$iSTime][$iSTime_Label], $sTime)
EndFunc

Func _GUICtrlSliderTime_SetState($iSTime, $iState)
    For $iID = 1 To $aSTime[0][0]
        If $iID = $iSTime Then
            GUICtrlSetState($aSTime[$iSTime][$iSTime_Slider], $iState)
            GUICtrlSetState($aSTime[$iSTime][$iSTime_Label], $iState)
            ExitLoop
        EndIf
    Next
EndFunc

Func __GUICtrlSliderTime_GetTimeDelim($sNowTime)
    Local $sDelim = RegRead('HKEY_CURRENT_USER\Control Panel\International', 'sTime')
    
    If $sDelim = '' And StringLen($sNowTime) >= 1 Then
        $aTime = StringSplit($sNowTime, '')
        
        For $i = 1 To $aTime[0]
            If Not Number($aTime[$i]) Then
                $sDelim &= $aTime[$i]
            EndIf
            
            If $sDelim <> '' And Number($aTime[$i]) Then
                ExitLoop
            EndIf
        Next
    EndIf
    
    Return $sDelim
EndFunc

Func __GUICtrlSliderTime_IsValidTime($sTime)
    Return StringRegExp($sTime, '^(?:0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$')
EndFunc

Func __GUICtrlSliderTime_WM_HVSCROLL($hWnd, $iMsg, $wParam, $lParam)
    For $i = 1 To $aSTime[0][0]
        If $lParam = GUICtrlGetHandle($aSTime[$i][$iSTime_Slider]) Then
            _GUICtrlSliderTime_SetTime($i)
            ExitLoop
        EndIf
    Next
    
    Return $GUI_RUNDEFMSG
EndFunc
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Что значит выпадающим?
В таком виде окно получается очень большое. Вот и думал скрыть за кнопкой: нажал и выпал/показался слайдер (ползунок).

У меня считывает так, как отображается в поле
Странно, у меня сделано вот так и считывает в ConsolWrite только в таком виде: 2020|12|21|0|44
Код:
Local $sStyle = 'HH:mm:ss'
Local $idTimeS = GUICtrlCreateDate("", 270, 10, 100, 25, BitOR($DTS_SHOWNONE, $DTS_TIMEFORMAT))
GUICtrlSendMsg($idTimeS, $DTM_SETFORMATW, 0, $sStyle)
......
Local $tTimeS = _GUICtrlDTP_GetSystemTimeEx($hTimeS)
     $4 = $tTimeS.Hour
     $5 = $tTimeS.Minute
ConsoleWrite( $4 & '|' & $5 & @CR)

GUICtrlRead($hTimeS) вообще ничего не дает
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
у меня сделано вот так и считывает в ConsolWrite только в таком виде
Естественно, _GUICtrlDTP_GetSystemTimeEx возвращает значения word (целое число), так прописано в её структуре.
Именно поэтому в справке и указано правильное применение для получаемых данных.

GUICtrlRead($hTimeS) вообще ничего не дает
А должно? Внимательнее смотрим что такое $hTimeS, и что требует функция GUICtrlRead.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
думал скрыть за кнопкой: нажал и выпал/показался слайдер
Вместо $GUI_DISABLE/ENABLE можно указать $GUI_HIDE/SHOW...
Код:
...

$iTime1_CB = GUICtrlCreateCheckbox('Time 1:', 10, 20, -1, 20)
$iSliderTime1 = _GUICtrlSliderTime_Create($hGUI, 10, 50, 25, 180, '00:00', $STIME_ALIGN_TOP, True)
_GUICtrlSliderTime_SetTime($iSliderTime1, '12:00')
_GUICtrlSliderTime_SetState($iSliderTime1, $GUI_HIDE)

...

        Case $iTime1_CB, $iTime2_CB
            _GUICtrlSliderTime_SetState( _
                ($iMsg = $iTime1_CB ? $iSliderTime1 : $iSliderTime2), _
                (GUICtrlRead($iMsg) = $GUI_CHECKED ? $GUI_SHOW : $GUI_HIDE))

...


И соответственно менять размеры окна в момент отображения/скрытия.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
А должно? Внимательнее смотрим что такое $hTimeS, и что требует функция GUICtrlRead.
Спасибо. Видать ночью невнимательно перенес, нужно ж $idTimeS
Вместо $GUI_DISABLE/ENABLE можно указать $GUI_HIDE/SHOW...
Так не удобно, потому что либо текст перекрывает в большом окне, либо резиновое окно делать. Можно конечно резиновым делать, но я попробую придумать именно выпадающим.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
попробую придумать именно выпадающим
Имеется в виду по нажатию кнопки?
Можно сделать дополнительно дочернее окно (с $WS_POPUP), и уже на нём создавать слайдер, тогда это будет похоже на нечто типа Combo.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481

Вложения

  • GUISliderTime.zip
    2.8 КБ · Просмотры: 5
Верх