Что нового

[Элементы GUI] Как написать "Индикатор задержки"? - не "бар заполнения"! (+)

akoulev

Чайник
Сообщения
164
Репутация
2
Дано: есть давным-давно написанный -и даже неплохо работающий :whistle:- скрипт, частью коего является 5-минутная задержка:
Код:
Sleep(5*60*1000)

, но непонятно, - при случайном взгляде на экран: то ли первая минута "задержки" только что пошла; то ли последняя минута уже заканчивается... Что есть весьма неудобно.
И вот, 'душа просит' ;D такого графического индикатора 5-минутной задержки, de facto - графического таймера (даю описание желанного индикатора по порядку.):
1) Жёлтенький круг a'ля "Солнышко" в центре экрана. Радиус (диаметр) 'солнышка' (в сантиметрах/миллиметрах/пикселях) - имхо, можно брать из ini-шника.
2) 12 рисок по кругу - типа делений циферблата часов. Вместо риски может быть и точка.
3) В центре - секундная (и только секундная!) стрелка, раз в секунду совершающая доворот на одну шестидесятую от трёхсот шестидесяти градусов. (т.е., на 6 градусов. :smile: ); впрочем, может двигаться и непрерывно; - лишь бы оборот совершался за 60 секунд. Ну, или около того. ;)
4) ГЛАВНОЕ!!! Чтобы на жёлтом солнышке постоянно находилась, скажем, синяя цифра, очень крупная, - практически во весь круг; показывающая, сколько минут осталось до 5-и (можно и до 9 включительно - для 10-минутной задержки; значение можно брать из ini-шника.)
5) Отсчёт минут - обратный; но можно сделать и опцию (прямой/обратный, и значение можно брать из того же ini-шника.) Смена минут - в 00 секунд.
6) При клике на "солнышке", пусть оно (солнышко) исчезает на 5 секунд. (или же - на "сколько-то секунд"; тот же ini-шник). Может, также, и не исчезать, а становиться крепко прозрачнее, на "сколько-то процентов"; "сколько-то " - ini-шник).
7) По окончанию отмеренного срока задержки (цифра "0" без кавычек + полный оборот нашей секундной стрелки) - пусть исчезает (вариант - исчезает вкупе со взрывом мультяшной "бомбочки"; наличие "бомбочки" - ini-шник; звук "взрыва" - ini-шник.)
8) Напомню, что отсчёт 5-и минут начинается с цифры 4; если же с 5-и, то это будет уже 6 минут. ;) Впрочем, цифра 5 имеет моральное право появиться при старте задержки, на одну секунду.

Ай нид хелп, плиз - сам я этого точно не напишу... ;( !
 
Автор
A

akoulev

Чайник
Сообщения
164
Репутация
2
Народ, ау!
Черкните хоть словечко-то!
Уже 80 человек прочло - и ти-ши-на: что, конечно, тоже -в своём роде- ответ, - и всё-таки, всё-таки... Во, идея! Мини-опрос, на тему "я не отвечаю на этот вопрос, поскольку":
1) Слишком наглая просьба [ ] ;)
2) Это слишком просто [ ]
3) Это слишком очевидно [ ]
4) Это слишком сложно [ ]
5) Я б с душой, да времени нет [ ]
6) Что-то своё, сокровенно-затаённое.

Hint: Я прекрасно понимаю, что мне никто ничего не должен. :smile: И я очень благодарен за помощь, которую мне здесь всегда оказывали. Понимаю, что что-то не так в моём вопросе-запросе, поэтому хочу прояснить для себя (И для всех (с) Деконт, к/ф "Кин-дза-дза"), что я делаю не так.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
В качестве рекомендации
1. писать как можно коротко и четко. Не все могут позволить себе читать столько лирических отступлений.
2. Данная тема скорее уместна тут http://autoit-script.ru/index.php/board,8.0.html
Т.к. ты не приводишь свой код, где не можешь разобраться в каких-либо особенностях или тонкостях или просто-напросто не знаешь синтаксиса того или иного действия, а просишь написать с нуля готовый скрипт.

По поводу сложности, сложного ничего нет. Но муторно. Легче делать исправления в готовом скрипте или вносить модификации. В принципе весь алгоритм ты сам написал. а это как минимум 50% всего дела. Я сам так делаю. сначала расписываю порядок действий а потом реализую его с помощью команд AutoIt. Хелп всегда под рукой. Советую делать так же ;)
Но сначала, все же прислушайся к совету 2 и создай тему в разделе "Стол заказов"
 
Автор
A

akoulev

Чайник
Сообщения
164
Репутация
2
Спасибо; код, кстати, я приводил:
Код:
Sleep(5*60*1000)

;D
Общую мысль я понял; но надо с чего-то начать. Скажем, код
Код:
MsgBox(0, "MsgBox", "Message", 11)

даёт нам левое окошко [см. картинку ниже]; а вот как получить правое окошко?

Я-то его получил, благодаря mspaint-у... :whistle:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Код:
#include <GUIConstantsEx.au3>
$path = 'путь до картинки в формате jpg, bmp, gif'
;$path = @ScriptDir & '\smile.jpg'
$hGUI = GUICreate('MsgBox', 150, 150, -1, -1)
$hOK = GUICtrlCreateButton('OK', 15, 120, 120, 20)
$pic = GUICtrlCreatePic($path, 10, 10, 130, 100)
GUISetState()
$start = TimerInit()
While TimerDiff($start) / 1000 < 3; Задержк в 3 секунды
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE, $hOK
			GUIDelete($hGUI)
			ExitLoop
	EndSwitch
WEnd
 
Автор
A

akoulev

Чайник
Сообщения
164
Репутация
2
Спасибо; изучаю/вникаю.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
$start = TimerInit()
$pos = WinGetPos('[CLASS:Shell_TrayWnd]')
$delta = $pos[3]
Global $diameter = 200
Global $title = 'Это желтый круг'
$xC = @DesktopWidth / 2 - $diameter / 2
$yC = @DesktopHeight / 2 - $diameter / 2 - $delta
$hGUI = GUICreate($title, $diameter, $diameter, $xC, $yC, $WS_POPUP)
GUISetBkColor(0xFFFF00)
_GuiRoundCorners($hGUI, 0, 0, $diameter, $diameter)
$pic = GUICtrlCreatePic('', 0, 0, $diameter, $diameter, -1, $GUI_WS_EX_PARENTDRAG)

$hGr = GUICtrlCreateGraphic(0, 0, $diameter, $diameter)
GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 2)
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff0000, 0xff0000)
$Pi = 3.14159265358979
For $i = 1 to 12
	GUICtrlSetGraphic(-1, $GUI_GR_DOT, $diameter / 2 + (($diameter - 10) / 2) * Cos($i*2*$Pi / 12), $diameter / 2 + (($diameter - 10) / 2) * Sin($i*2*$Pi / 12))
Next
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x00FF00, $GUI_GR_NOBKCOLOR)
GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, $diameter / 2 - 60, $diameter / 2 - 60, 120, 120)
GUISetState(@SW_SHOW)
$sec_old = -1
$tick = ''
$time = ''
$press = 0
While TimerDiff($start) / 1000 < 300
    $msg = GuiGetMsg()
	$sec_new = Int(TimerDiff($start) / 1000)
	$min = 4 - Int($sec_new / 60)
	If $sec_old <> $sec_new Then
		GUICtrlDelete($tick)
		GUICtrlDelete($time)
		$sec_old = $sec_new
		$tick = GUICtrlCreateGraphic(0, 0, 1, 1)
		GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 2)
		GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x0000ff, 0x0000ff)
		GUICtrlSetGraphic(-1, $GUI_GR_MOVE, $diameter / 2 + 62*Cos($sec_new*6*$Pi/180 - $Pi/2), $diameter / 2 + 62*Sin($sec_new*6*$Pi/180 - $Pi/2))
		GUICtrlSetGraphic(-1, $GUI_GR_LINE, $diameter / 2 + (($diameter-25)/2)*Cos($sec_new*6*$Pi/180 - $Pi/2), $diameter / 2 + (($diameter-25)/2)*Sin($sec_new*6*$Pi/180 - $Pi/2))
		$time = GUICtrlCreateLabel($min, 10, 25, 180, 180, $SS_CENTER)
		GUICtrlSetColor(-1, 0x0000FF)
		GUICtrlSetFont(-1, 100)
		GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
		GUICtrlSetGraphic($tick, $GUI_GR_REFRESH)
	EndIf
	Switch $msg	
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $GUI_EVENT_SECONDARYUP
			Switch $press
				Case 0
					WinSetTrans($title, '', 100)
					$press = 1
				Case 1
					WinSetTrans($title, '', 255)
					$press = 0
				EndSwitch
	EndSwitch
WEnd
Func _GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
   Dim $pos, $ret, $ret2
   $pos = WinGetPos($h_win)
    $ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long",  $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3,  "long", $i_y3)
   If $ret[0] Then
      $ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1)
      If $ret2[0] Then
         Return 1
      Else
         Return 0
      EndIf
   Else
      Return 0
   EndIf
EndFunc;==>_GuiRoundCorners

После запуска скрипта идет отсчет времени. Секундная стрелка перемещается на 6 градусов за 1 с, тем самым делая один полный оборот за 1 мин. В центре время в мин. оставшееся до конца работы скрипта.
При ПКМ выставляется прозрачность 100, при втором ПКМ прозрачность убирается. Окно двигается Drag'ом ЛКМ
По истечению времени скрипт закроется. Все параметры регулируются в скрипте. Чтение из ini, дума/надеюсь доработаешь сам.
 
Автор
A

akoulev

Чайник
Сообщения
164
Репутация
2
Вау; Kaster, Ты - гений!!! :beer:
Вот теперь я буду ДОЛГО осознавать, чё-как в этом коде работает!
Код:
$i=0
While $i<1000000000 
$i=$i+1
MsgBox ( "" , "" , "Спасибо № " & $i & "!!!" , 1)
Wend
Exit
:laugh:
 
Автор
A

akoulev

Чайник
Сообщения
164
Репутация
2
Уважаемый Kaster, у меня пара проблем с этим кодом:
1) Иногда отображается не большая и синяя цифра минут, а совсем маленькая и чёрная (где-то ~на секунду), типа - 10-м кеглем, похоже на какой-то системный шрифт; - не то чтобы это очень уж сильно мешало, но "куда копать" - непонятно вообще; кстати, круг вместе с синей цифрой иногда -при смене текущей секунды- сильно "вздрагивает" - обновляясь целиком; а иногда - нет. Видеокарта - более чем стабильна (сын-"игрун", 'Team Fortress' у него идёт нормально).
2) Захотел в одним из скриптов сделать задержку 1 мин. (а не дефолтные 5); сказано - сделано;
Код:
$min = 0 - Int($sec_new / 60); ЗАДАЁМ КОЛИЧЕСТВО МИНУТ

Запускаем - стартует, понятно, нормально; но когда доходит до 0 минут 0 секунд, то из программы не выходит, а продолжает работать; минута при этом становится -1 (минус один). Тот же эффект - если делаем 2 минуты (1мин+60сек). К моему великому стыду, я так и не понял, где искать жёстко заданные изначальные 5 минут.
3) Для самостоятельной отладки, хотел бы добавить режим "торопыжка", чтобы стрелка обходила круг не за 60 сек, а, скажем, за 2-3-5 секунд - и тоже, не совсем понятно, как это сделать.

Основной вопрос - конечно, пункт 2. Pls.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
akoulev
Я думаю, общее время работы скрипта скрыто под цифрой 300 в строке с While...
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
akoulev
Замени
в коде это:
Код:
While TimerDiff($start) / 1000 < 300
    $msg = GuiGetMsg()
    $sec_new = Int(TimerDiff($start) / 1000)

на это:
Код:
$speed = 100 ; чем меньше параметр, тем больше скорость
While TimerDiff($start) / $speed < 300
    $msg = GuiGetMsg()
    $sec_new = Int(TimerDiff($start) / $speed)

:smile:
 
Автор
A

akoulev

Чайник
Сообщения
164
Репутация
2
Re: [Элементы GUI] Как написать \"Индикатор задержки\"? - не \"бар заполнения\"! (+)

Guezt сказал(а):
akoulev
Замени
в коде это:
Код:
While TimerDiff($start) / 1000 < 300
    $msg = GuiGetMsg()
    $sec_new = Int(TimerDiff($start) / 1000)

на это:
Код:
$speed = 100 ; чем меньше параметр, тем больше скорость
While TimerDiff($start) / $speed < 300
    $msg = GuiGetMsg()
    $sec_new = Int(TimerDiff($start) / $speed)

:smile:
Нет, Ты неправ: заменив 1000 на 100, я получил, что прога вырубается через 12 секунд, стрелка при этом не прошла даже одного оборота.


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

snoitaleR сказал(а):
akoulev
Я думаю, общее время работы скрипта скрыто под цифрой 300 в строке с While...
Спасибо: это помогло. Теперь код:
Код:
Zaderj();

Func Zaderj();
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
$start = TimerInit()
$minut = 1; ЗАДАЁМ КОЛИЧЕСТВО МИНУТ, к которым добавляется 60 сек.; щас - 1 мин; => таймер на 2 мин.
$minut = $minut*60 + 60
$pos = WinGetPos('[CLASS:Shell_TrayWnd]')
$delta = $pos[3]
Global $diameter = 200
Global $title = 'Это желтый круг'
$xC = @DesktopWidth / 2 - $diameter / 2
$yC = @DesktopHeight / 2 - $diameter / 2 - $delta
$hGUI = GUICreate($title, $diameter, $diameter, $xC, $yC, $WS_POPUP)
GUISetBkColor(0xFFFF00)
_GuiRoundCorners($hGUI, 0, 0, $diameter, $diameter)
$pic = GUICtrlCreatePic('', 0, 0, $diameter, $diameter, -1, $GUI_WS_EX_PARENTDRAG)

$hGr = GUICtrlCreateGraphic(0, 0, $diameter, $diameter)
GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 2)
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff0000, 0xff0000)
$Pi = 3.14159265358979
For $i = 1 to 12
    GUICtrlSetGraphic(-1, $GUI_GR_DOT, $diameter / 2 + (($diameter - 10) / 2) * Cos($i*2*$Pi / 12), $diameter / 2 + (($diameter - 10) / 2) * Sin($i*2*$Pi / 12))
Next
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x00FF00, $GUI_GR_NOBKCOLOR)
GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, $diameter / 2 - 60, $diameter / 2 - 60, 120, 120)
GUISetState(@SW_SHOW)
$sec_old = -1
$tick = ''
$time = ''
$press = 0
$speed = 1000 ; чем меньше параметр, тем больше скорость;default=1000 - неверно!!!!
While TimerDiff($start) / $speed < $minut
    $msg = GuiGetMsg()
    $sec_new = Int(TimerDiff($start) / 1000)
    $min = (($minut-60)/60) - Int($sec_new / 60); ЗАДАЁМ КОЛИЧЕСТВО МИНУТ; щас - 0
    If $sec_old <> $sec_new Then
        GUICtrlDelete($tick)
        GUICtrlDelete($time)
        $sec_old = $sec_new
        $tick = GUICtrlCreateGraphic(0, 0, 1, 1)
        GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 2)
        GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x0000ff, 0x0000ff)
        GUICtrlSetGraphic(-1, $GUI_GR_MOVE, $diameter / 2 + 62*Cos($sec_new*6*$Pi/180 - $Pi/2), $diameter / 2 + 62*Sin($sec_new*6*$Pi/180 - $Pi/2))
        GUICtrlSetGraphic(-1, $GUI_GR_LINE, $diameter / 2 + (($diameter-25)/2)*Cos($sec_new*6*$Pi/180 - $Pi/2), $diameter / 2 + (($diameter-25)/2)*Sin($sec_new*6*$Pi/180 - $Pi/2))
        $time = GUICtrlCreateLabel($min, 10, 25, 180, 180, $SS_CENTER)
        GUICtrlSetColor(-1, 0x0000FF)
        GUICtrlSetFont(-1, 100)
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
        GUICtrlSetGraphic($tick, $GUI_GR_REFRESH)
    EndIf
    Switch $msg 
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $GUI_EVENT_SECONDARYUP
            Switch $press
                Case 0
                    WinSetTrans($title, '', 100)
                    $press = 1
                Case 1
                    WinSetTrans($title, '', 255)
                    $press = 0
                EndSwitch
    EndSwitch
WEnd
EndFunc

Func _GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
   Dim $pos, $ret, $ret2
   $pos = WinGetPos($h_win)
    $ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long",  $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3,  "long", $i_y3)
   If $ret[0] Then
      $ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1)
      If $ret2[0] Then
         Return 1
      Else
         Return 0
      EndIf
   Else
      Return 0
   EndIf
EndFunc;==>_GuiRoundCorners
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Re: [Элементы GUI] Как написать \\\"Индикатор задержки\\\"? - не \\\"бар заполнения\\\"! (+)

akoulev
Замени
в коде это:
Код:
While  TimerDiff($start) / 1000 < 300
    $msg = GuiGetMsg()
     $sec_new = Int(TimerDiff($start) / 1000)

на это:
Код:
$speed  = 100 ; чем меньше параметр, тем больше скорость
While  TimerDiff($start) / $speed < 300
    $msg = GuiGetMsg()
     $sec_new = Int(TimerDiff($start) / $speed)

:smile:

проверка на минус:
заменить это:
Код:
$time = GUICtrlCreateLabel($min, 10, 25, 180, 180, $SS_CENTER)

на это:
Код:
if $min >= 0 Then
         $time = GUICtrlCreateLabel($min, 10, 25, 180, 180, $SS_CENTER)
         Else
         EndIf

в общем вот кусок полностью:
Код:
$speed = 10 ; по умолчанию 1000 ( секунда )
 $sMin = 15 ; количество минут 
 While TimerDiff($start) / $speed < 60*$sMin ; тут было 300 тоесть 5  минут по 60 секунд 
     $msg = GuiGetMsg()
     $sec_new = Int(TimerDiff($start) / $speed)
     $min = $sMin - Int($sec_new / 60) ; и тут минуты 
     If $sec_old <> $sec_new Then
         GUICtrlDelete($tick)
         GUICtrlDelete($time)
         $sec_old = $sec_new
         $tick = GUICtrlCreateGraphic(0, 0, 1, 1)
         GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 2)
         GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x0000ff, 0x0000ff)
         GUICtrlSetGraphic(-1, $GUI_GR_MOVE, $diameter / 2 +  62*Cos($sec_new*6*$Pi/180 - $Pi/2), $diameter / 2 +  62*Sin($sec_new*6*$Pi/180 - $Pi/2))
         GUICtrlSetGraphic(-1, $GUI_GR_LINE, $diameter / 2 +  (($diameter-25)/2)*Cos($sec_new*6*$Pi/180 - $Pi/2), $diameter / 2 +  (($diameter-25)/2)*Sin($sec_new*6*$Pi/180 - $Pi/2))
         if $min >= 0 Then ; тут проверка на отрицательность минуты
         $time = GUICtrlCreateLabel($min, 10, 25, 180, 180, $SS_CENTER)
         Else
         EndIf
         GUICtrlSetColor(-1, 0x0000FF)
         GUICtrlSetFont(-1, 100)
         GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
         GUICtrlSetGraphic($tick, $GUI_GR_REFRESH)
     EndIf
     Switch $msg
         Case $GUI_EVENT_CLOSE
             ExitLoop
         Case $GUI_EVENT_SECONDARYUP
             Switch $press
                 Case 0
                     WinSetTrans($title, '', 100)
                     $press = 1
                 Case 1
                     WinSetTrans($title, '', 255)
                     $press = 0
                 EndSwitch
     EndSwitch
 WEnd


и да простит меня Kaster

где я параметр $speed поменял это лишь для того что бы быстро прогнать скрипт :smile:


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

akoulev [?]
Нет, Ты неправ: заменив 1000 на 100, я получил, что прога вырубается через 12 секунд, стрелка при этом не прошла даже одного оборота.
ну я смотрю к твой код ты в одном месте только скорость поменял а я в двух в том числе и на новую стрелку ;)
Код:
$sec_new = Int(TimerDiff($start) / $speed)
тут :smile:


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

Вот полностью код, проверь ;)
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
$start = TimerInit()
$pos = WinGetPos('[CLASS:Shell_TrayWnd]')
$delta = $pos[3]
Global $diameter = 200
Global $title = 'Это желтый круг'
$xC = @DesktopWidth / 2 - $diameter / 2
$yC = @DesktopHeight / 2 - $diameter / 2 - $delta
$hGUI = GUICreate($title, $diameter, $diameter, $xC, $yC, $WS_POPUP)
GUISetBkColor(0xFFFF00)
_GuiRoundCorners($hGUI, 0, 0, $diameter, $diameter)
$pic = GUICtrlCreatePic('', 0, 0, $diameter, $diameter, -1, $GUI_WS_EX_PARENTDRAG)

$hGr = GUICtrlCreateGraphic(0, 0, $diameter, $diameter)
GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 2)
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff0000, 0xff0000)
$Pi = 3.14159265358979
For $i = 1 to 12
    GUICtrlSetGraphic(-1, $GUI_GR_DOT, $diameter / 2 + (($diameter - 10) / 2) * Cos($i*2*$Pi / 12), $diameter / 2 + (($diameter - 10) / 2) * Sin($i*2*$Pi / 12))
Next
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x00FF00, $GUI_GR_NOBKCOLOR)
GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, $diameter / 2 - 60, $diameter / 2 - 60, 120, 120)
GUISetState(@SW_SHOW)
$sec_old = -1
$tick = ''
$time = ''
$press = 0
$speed = 10 ; по умолчанию 1000 ( секунда )
$sMin = 15 ; количество минут
While TimerDiff($start) / $speed < 60*$sMin
    $msg = GuiGetMsg()
    $sec_new = Int(TimerDiff($start) / $speed)
    $min = $sMin - Int($sec_new / 60)
    If $sec_old <> $sec_new Then
        GUICtrlDelete($tick)
        GUICtrlDelete($time)
        $sec_old = $sec_new
        $tick = GUICtrlCreateGraphic(0, 0, 1, 1)
        GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 2)
        GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x0000ff, 0x0000ff)
        GUICtrlSetGraphic(-1, $GUI_GR_MOVE, $diameter / 2 + 62*Cos($sec_new*6*$Pi/180 - $Pi/2), $diameter / 2 + 62*Sin($sec_new*6*$Pi/180 - $Pi/2))
        GUICtrlSetGraphic(-1, $GUI_GR_LINE, $diameter / 2 + (($diameter-25)/2)*Cos($sec_new*6*$Pi/180 - $Pi/2), $diameter / 2 + (($diameter-25)/2)*Sin($sec_new*6*$Pi/180 - $Pi/2))
        if $min >= 0 Then
        $time = GUICtrlCreateLabel($min, 10, 25, 180, 180, $SS_CENTER)
        Else
        EndIf
        GUICtrlSetColor(-1, 0x0000FF)
        GUICtrlSetFont(-1, 100)
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
        GUICtrlSetGraphic($tick, $GUI_GR_REFRESH)
    EndIf
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $GUI_EVENT_SECONDARYUP
            Switch $press
                Case 0
                    WinSetTrans($title, '', 100)
                    $press = 1
                Case 1
                    WinSetTrans($title, '', 255)
                    $press = 0
                EndSwitch
    EndSwitch
WEnd
Func _GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
   Dim $pos, $ret, $ret2
   $pos = WinGetPos($h_win)
    $ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long",  $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3,  "long", $i_y3)
   If $ret[0] Then
      $ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1)
      If $ret2[0] Then
         Return 1
      Else
         Return 0
      EndIf
   Else
      Return 0
   EndIf
EndFunc;==>_GuiRoundCorners
 
Автор
A

akoulev

Чайник
Сообщения
164
Репутация
2
Да, точно, спасибо!!! Торопыжка реализован! Но как же теперь экран рябит (там, где размещено "солнышко"), - боже ж мой! :smile:
Репутацию 'подкручу' через сутки - лимит-с; ещё раз спасибо!!!
 
Верх