На этом шаге мы рассмотрим окно часов.
Полагая, что действия компонентов вы освоили, попробуем решить такую задачу создать окно, которое отображает текущее время.
Использовать таймер очень просто. Вы можете в любое время создать новый таймер для окна вызовом предиката timer_Set(Window, Milliseconds). Как только предикат timer_set был вызван, окно в указанные интервалы времени будет получать событие e_Timer.
На событие обновления e_Update мы будем выводить текущее время, центрированное в окне. Мы можем получить время запросом к предикату time/4. Первые три целых числа, возвращенные time/4, затем преобразуются в строку предикатом format. Наконец, строка выводится в центре окна предикатом draw_TextInRect, которому передается полный клиентский прямоугольник для вывода текста по центру этого прямоугольника.
win_Clear(_Win,color_LtGray), RCT=win_GetClientRect(_Win), time(Hours,Minutes,Seconds,_), date(Year,Month,Day), format(Str, "%/%/% - %:%:%",Year,Month,Day,Hours,Minutes,Seconds), draw_TextInRect(_Win, RCT, Str, -1, [dtext_center,dtext_vcenter,dtext_singleline])
Каждый раз, когда окно изменяет свои размеры, изображение нужно перерисовывать. Правильнее будет не перерисовывать при событии изменения размера окна e_Size, а вызывать новое событие e_Update для всего окна.
win_clock_eh(_Win,e_Size(_Width,_Height),0):-!, win_Invalidate(_Win)
На событие e_Create мы запускаем таймер. Значение интервала в 1000 миллисекунд означает, что мы будем получать событие таймера каждую секунду.
win_clock_eh(_Win,e_Create(_),0):-!, _NewTimerId=timer_Set(_Win,1000)
На событие e_Timer мы будем объявлять окно недействительным. Это вызовет обновление окна в том случае, если оно не свернуто и не закрыто другим окном. (Вы найдете событие e_Timer под группой Misc в эксперте окон и диалоговых окон.)
win clock_eh(_Win,e_Timer(_TimerId),0):-!, win_Invalidate(_Win)
Обратите внимание, что в реальном приложении вы, вероятно, не стали бы объявлять недействительным целое окно, т.к. слишком много времени может потребоваться на то, чтобы перерисовать его. Если вы хотите, чтобы программа была быстрой и выглядела профессионально, нужно стараться не объявлять окно недействительным. Правда, это потребует дополнительных усилий уже после того, как основные функциональные возможности будут реализованы.
Таймеры - ограниченный ресурс системы. В реальном приложении идентификатор таймера, возвращаемый timer_set, должен быть сохранен для освобождения в событии e_Destroy, где он будет использоваться в качестве аргумента в предикате timer Kill/1.
Созданное приложение можно взять здесь (412,6 Кб)
На следующем шаге мы рассмотрим окно изображения.