1 (изменено: serzh82saratov, 2018-07-28 16:17:15)

Тема: AHK: Часы, таймер, секундомер

Класс позволяет добавлять контролы в виде табло часов. Встроены таймеры для часов, таймера и секундомера. Также с помощью контрола пользователь может выставить нужное ему время.

Ввод времени - LButton, RButton, WheelUp, WheelDown, MButton - сброс на 00, нижнее табло в Demo.


Class ClockGui.

+ Demo.

#SingleInstance Force
#Persistent
#NoEnv
ListLines Off
SetBatchLines -1

Gui, +HWNDhMain -DPIScale
Gui, Color, F9D886


Timer := New ClockGui(hMain, "Sec|Name MyTimer|w 400|h 120|ds 1|db 16|bckgmain F9D886|Font s80|Colon")
Timer.SetTime("10:00:04")  
Timer.StartTimer()
Timer.Show()

Watch := New ClockGui(hMain, "Pos xp y+10|Sec|Name MyWatch|w 400|h 120|ds 1|db 10|bckgmain F9D886|bckgitem FFFFFF|coloritem F9D886|Font s80")
Watch.SetTime("23:59:56")
Watch.StartWatch(, 1) 
Watch.Show()

Clock := New ClockGui(hMain, "Pos xp y+10|Section|w 400|h 120|db 20|bckgitem C0C0C0|coloritem 5671BD|Font s90|FontName Comic Sans MS|Colon Flash 100")
Clock.StartClock()
Clock.Show()

Clock2 := New ClockGui(hMain, "Pos xs+120 y+10|Sec|w 160|h 30|db 6|bckgitem F9D886|coloritem 010101|Font Bold s20|Colon Flash")
Clock2.StartClock()
Clock2.Show()

TestTimer := New ClockGui(hMain, "Pos xs y+10|Sec|Name TestTimer|w 400|h 120|ds 1|db 14|bckgmain 555555|Font s80|Colon Flash 300")
TestTimer.SetTime("00:00:03")
TestTimer.Show()

Gui, Add, Button, xp60 y+20 gTimerStart, Запустить таймер
Gui, Add, Button, x+20 yp gTimerStop, Остановить
Gui, Add, Button, x+20 yp gTimerReset, Сбросить
Gui, Show
Return

TimerStart:
	TestTimer.StartTimer("EndTimer")
	Return

TimerStop:
	TestTimer.Stop(1)
	TestTimer.Block(0)
	Return

TimerReset:
	Gosub, TimerStop
	TestTimer.SetTime("00:00:03")
	Return

EndTimer(This) {
	MsgBox % This.Name "`nВремя вышло"
	(!This.Loop && This.Block(0))
}

GuiClose:
	ExitApp

https://ic.pics.livejournal.com/the_bestseller/49384395/14996/14996_900.png

+ Запуск секундомера и таймера относительно времени суток.

#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1

CheckTime := ClockGui.MathTime("", "+", "00:00:03")   ;	прибавляем к текущему времени три секунды. это будет стартовым временем суток таймера и секундомера

Gui, +HWNDhMain
Gui, Color, F9D886
TestTimer := New ClockGui(hMain, "Sec|Name Timer1|w 400|h 120|ds 1|db 10|bckgmain F9D886|Font s80")
TestTimer.Show()
;	1 - указываем функцию обработчик при наступлении стартового времени. Можно оставить пустым - ""
;	2 - стартовое время. Если пусто, то текущее время. Если "User" то будет взято время установленное в TestTimer вручную
;	3 - если последний параметр правда, то при наступлении стартового времени отсчёт продолжается на следующие сутки
TestTimer.StartTimerDay("EndTimer" , CheckTime, 1)

Clock := New ClockGui(hMain, "Sec|w 400|h 120|db 20|bckgmain F9D886|bckgitem C0C0C0|coloritem 5671BD|Font s80|Colon Flash")
Clock.Show()
Clock.StartClock()

Watch := New ClockGui(hMain, "Sec|Name Watch1|w 400|h 120|ds 1|db 10|bckgmain F9D886|bckgitem FFFFFF|coloritem F9D886|Font s80")
Watch.Show()
Watch.StartWatchDay("EndTimer", CheckTime, 1)

Gui, Show
Return

EndTimer(This) {
	MsgBox % This.Name " - контрольное время " This.CheckDate " достигнуто"
}

GuiClose:
	ExitApp
+ Выставляем время суток, запускаем цикличный таймер до указанного времени.

#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1

Gui, +HWNDhMain
Gui, Color, F9D886

Clock := New ClockGui(hMain, "Sec|w 60|h 30|db 6|bckgitem F9D886|coloritem 5671BD|Font Bold|Colon Flash")
Clock.StartClock()
Clock.Show()

Timer := New ClockGui(hMain, "Sec|Name Timer|w 400|h 120|ds 1|db 14|bckgmain 444444|Font s80|Colon Flash")
Timer.SetTime(Timer.MathTime("", "+", "00:01:00")) ; прибавляем 1 минуту к текущему времени
Timer.Show() 

Gui, Add, Button, xp115 y+10 gTimerStart, Запустить таймер
Gui, Add, Button, x+20 yp gTimerReset, Сброс

Gui, Show
Return

TimerStart:
	Timer.StartTimerDay("EndTimer", "User", 1)
	Return
	
TimerReset:
	Timer.Reset()
	Timer.Block(0)
	Return
	
EndTimer(This) {
	MsgBox % This.Name " - контрольное время " This.CheckDate " достигнуто"
}

GuiClose:
	ExitApp
+ Таймер с мелодией:

#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1
OnMessage(0x404, "AHK_NOTIFYICON")

PlayFile = D:\Music\Ringtones\Aydio_-_02_-_Deltitnu.mp3
TimeStart = 00:00:00
VolumeStart = 6
StartHide := 600  ;	0 - нескрывать после старта таймера, или кол-во мс через которое скрывать

Menu, Tray, UseErrorLevel
Menu, Tray, Icon, Shell32.dll, 266
Menu, Tray, Click, 1
Menu, Tray, NoStandard
Menu, Tray, Add, Min/Max, MinMax
Menu, Tray, Default, Min/Max 
Menu, Tray, Add, Close, Exit

Gui, +HWNDhMain +AlwaysOnTop +Owner -MinimizeBox -MaximizeBox
Gui, Color, F9D886
Gui, Margin, 10, 10
Gui, Font, s14
Timer := New ClockGui(hMain, "Sec|Timer|w 500|h 120|ds 1|db 20|bckgmain 444444|bckgitem 212121|coloritem FFFFFF|Font s90|Colon Flash")
Timer.SetTime(TimeStart)  
Timer.Show()
Gui, Add, Text, xp y+10 wp vInfo Center r2
Gui, Add, Button, xp y+10 gTimerStart, Запустить
Gui, Add, Button, x+39 yp gTimerPause, Пауза
Gui, Add, Button, x+39 yp gTimerRetry, Вернуть
Gui, Add, Button, x+39 yp gTimerReset, Сбросить
Gui, Add, Checkbox, x10 y+20 vPlaySound gCheckbox Checked1, Проигрывать мелодию
Gui, Add, Slider, x+10 yp-10 w203 vVolumeSlider hwndhVolumeSlider gSlider Center AltSubmit, % VolumeStart
Gui, Add, Text, x+10 yp+8 vTextVolume w40 Center, % VolumeStart
Gui, Show, , Таймер
GuiControlGet, VolumeSlider
GuiControlGet, PlaySound
Return

#If Playing
Space::
	Gosub, MinMax
	GoSub, Stop
	Return

EndTimer(This) {
	Global
	This.Stop(1), This.Block(0)
	This.SetTime(Duration)
	GuiColor("E5684A")
	Playing := 1
	SetTimer, Playing, -1
	Gui, Show
	This.SetTime("00:00:00")
	This.StartWatch("", 1)
	TrayTip  ;	, % "Сработал таймер`n, прошло: " Duration, % " ", , 1
	GuiControl, , Info, % "сработал таймер`nпродолжительность: " Duration
	SetTimer, MinMax, Off
}

Playing:
	GuiControl, Disable, PlaySound
	If !PlaySound
		Return
	SoundGet, PrVolume
	SoundSet, %VolumeSlider%
	SoundPlay, %PlayFile%
	Return

SoundStop:
	SoundPlay, ::
	SoundSet, %PrVolume%
	Return

TimerStart:
	If Playing
		GoTo, Stop
	If !Timer.StartTimer("EndTimer")
		Return
	GuiColor("55C335")
	TrayTip, % "Запущен таймер`n, продолжительность: " , % (TimeAddStr(Duration := Timer.Get(), 2)), , 1 
	 
	GuiControl, , Info, % "запущен в: " A_Hour ":" A_Min ":" A_Sec "    сработает в: " Timer.MathTime("", "+", Timer.Get()) "`nпродолжительность: " TimeAddStr(Duration, 2) 
	If StartHide
		SetTimer, MinMax, -%StartHide%
	Return
	
TimerRetry:
TimerPause:
Stop:
	If (Playing && PlaySound)
		GoSub, SoundStop
	Playing := 0
	GuiColor("F9D886")
	Timer.Stop(1), Timer.Block(0)
	GuiControl, Enable, PlaySound
	SetTimer, MinMax, Off
	GuiControl, , Info
	If A_ThisLabel = TimerRetry
		Timer.SetTime(Duration)
	Return 

TimerReset:
	GoSub, Stop
	Timer.SetTime(TimeStart)
	Return

GuiEscape:
GuiClose:
	Gosub, MinMax
	If Playing
		GoSub, Stop
	Return

Exit:
	ExitApp
	Return

MinMax:
	Gui, Show, % !DllCall("IsWindowVisible", "Ptr", hMain) ? "" : "Hide"
	Return

Slider:
	GuiControlGet, VolumeSlider
	GuiControl, , TextVolume, % VolumeSlider
	If (Playing && PlaySound)
		SoundSet, %VolumeSlider%
	Return

Checkbox:
	GuiControlGet, PlaySound
	Return

AHK_NOTIFYICON(wParam,lParam,Msg,hwnd) {
	Global
	If (lParam = 0x200) ; move
		Menu, Tray, Tip, % "Таймер" (Playing || Timer.Stop() ? "" : "`nОсталось: " Timer.Get() " из " Duration)
}

GuiColor(Color) {
	Static prColor
	If (prColor = Color)
		Return
	Gui, Color, % (prColor := Color)
	GuiControl, Disable, VolumeSlider
	GuiControl, Enable, VolumeSlider
}

TimeAddStr(Time, Trim=0, d=" ") { 
	Local k, v, r1, r2, r3
	Static m := [["час","часа","часов"],["минута","минуты","минут"],["секунда","секунды","секунд"]]
	, s := {1:1,2:2,3:2,4:2,5:3,6:3,7:3,8:3,9:3,0:3}
	For k, v in StrSplit(Time, ":") {
		(!v) && (Trim >= k || (k = 3 && r1 || r2)) 
		|| (v > 10 && v < 20) && (1, r%k% := v + 0 " " m[k][3] d)
		|| (r%k% := v + 0 " " m[k][s[SubStr(v, 0)]] d)
	} Return RTrim(r1 r2 r3, d)
}

https://ic.pics.livejournal.com/the_bestseller/49384395/15537/15537_900.png



Укороченный вариант класса с примером, только для вывода часов.


Тема для обсуждения.


3:30 11.07.2018 - добавлено относительное позиционирование

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).