Что нового

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

DyadyaGenya

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

CreatoR

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

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Код:
#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

Знающий
Сообщения
309
Репутация
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,673
Репутация
2,487

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
вариант со слайдером (ползунком) но все равно не могу прикрутить туда чекбокс.
Вот сделал небольшую библиотеку:
Код:
#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

Знающий
Сообщения
309
Репутация
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,673
Репутация
2,487
Попробовал сделать ползунок вертикальным и выпадающим
Что значит выпадающим?
Для вертикального нужно также регистрировать и $WM_VSCROLL.
Позже попробую сделать флаг для этого.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Позже попробую сделать флаг для этого
Код:
#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

Знающий
Сообщения
309
Репутация
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,673
Репутация
2,487
у меня сделано вот так и считывает в ConsolWrite только в таком виде
Естественно, _GUICtrlDTP_GetSystemTimeEx возвращает значения word (целое число), так прописано в её структуре.
Именно поэтому в справке и указано правильное применение для получаемых данных.

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
думал скрыть за кнопкой: нажал и выпал/показался слайдер
Вместо $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

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

CreatoR

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

CreatoR

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

Вложения

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