Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

7.3.4 Создание аналоговых часов

Программе аналоговых часов нет необходимости учитывать международные аспекты, но сложность графики с лихвой компенсирует такое упрощение. Для того, чтобы сделать эту программу правильно, вам понадобится узнать, как использовать режимы отображения и даже немного тригонометрию. Ниже обсуждается программа ANACLOCK.

Режим отображения "isotropic" является идеальным для такого приложения, а устанавливает его в ANACLOCK.С функция SetIsotropic. После вызова функции SetMapMode, она устанавливает протяженности окна равными 1000, а протяженности области вывода равными половине ширины рабочей области и половине высоты рабочей области, взятой со знаком минус. Начало координат области вывода устанавливается в центр рабочей области. Как рассказывалось в главе 4, в результате создается Декартова система координат с точкой (0, 0) в центре рабочей области и размерами, равными 1000 единиц по всем направлениям.

Функция RotatePoint вводит в игру тригонометрию. Три параметра функции — это массив из одной или более точек, число точек в массиве и угол поворота в градусах. Функция вращает точки по часовой стрелке (как это принято для часов) вокруг начала координат. Например, если переданная функции точка имеет координаты (0, 100) — фактически это положение 12:00 — и угол поворота равен 90 градусам, то точка оказывается в положении с координатами (100, 0) — что соответствует 3:00. Это делается с помощью формул:

x' = x * cos(a) + y * sin(a)

y' = y * cos(a) — x * sin(a)

Функция RotatePoint полезна, как мы вскоре увидим, для рисования как точек на циферблате, так и стрелок часов.

Функция DrawClock рисует 60 точек циферблата, начиная сверху (верхняя точка соответствует 12:00). Каждая из этих точек находится на расстоянии 900 единиц от начала координат, поэтому первая имеет координаты (0, 900), а каждая следующая отстоит от предыдущей на 6 градусов по часовой стрелке. У двенадцати точек диаметр равен 100 единицам; у остальных — диаметр 33 единицы. Точки рисуются с помощью функции Ellipse.

Функция DrawHands рисует часовую, минутную и секундную стрелки часов. Координаты, определяющие очертания стрелок (когда они находятся в вертикальном положении) хранятся в массиве структур POINT. В зависимости от времени, эти координаты вращаются с помощью функции RotatePoint и выводятся на экран с помощью функции Windows PolyLine. Обратите внимание, что часовая и минутная стрелки выводятся на экран только в том случае, если параметр bChange функции DrawHands равен TRUE. Когда программа обновляет стрелки часов, в большинстве случаев часовую и минутную стрелки перерисовывать не надо.

Теперь давайте обратим свое внимание на оконную процедуру. При обработке сообщения WM_CREATE оконная процедура получает текущее время, и сохраняет его в переменной dtPrevious. Эта переменная позже будет использоваться для определения, произошло ли изменение часов или минут с момента предыдущего обновления.

Первый раз часы рисуются при обработке первого сообщения WM_PAINT с помощью вызовов функций SetIsotropic, DrawClock и DrawHands. При вызове последней функции параметр bChange задается равным TRUE.

При обработке сообщения WM_TIMER WndProc сначала получает новое время и определяет необходимость перерисовки часовой и минутной стрелки. Если такая необходимость появляется, все стрелки рисуются белым пером, что стирает предыдущее положение стрелок. В противном случае белым пером стирается только секундная стрелка. Затем все стрелки рисуются черным пером.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]