Создание часов в visual studio

Обновлено: 07.07.2024

Циферблат стрелочных часов имеет круглую форму. Это означает, что прорисовка часов проще всего реализуется при использовании произвольных координат, измеряемых не в пикселах, а в более удобных единицах, с началом координат в центре. Из размещения начала координат в центре также следует, что вам не придется возиться со свойствами CenterX или CenterY объектов RotateTransform, позиционирующих стрелки часов, потому что начало координат также совпадает с центром вращения.

Традиционные стрелочные часы в графической среде подстраиваются под выделенное им пространство. Возникает искушение использовать для этой цели Viewbox, но со стрелочными часами такой подход создает проблемы. Система формирования макета (и Viewbox) считает, что размер объекта векторной графики равен максимальным значениям X и Y его координат. Отрицательные координаты игнорируются, включая координаты в трех квадратах часов, у которых начало координат располагается в центре.

Система формирования макета (и Viewbox) неправильно определяет размер графических объектов с отрицательными координатами. Но преобразования распространяются от родителей к потомкам. Если назначить преобразование для панели Grid, оно будет применено ко всему содержимому Grid. Для содержимого Grid могут определяться и собственные преобразования.

Именно так я поступил в программе AnalogClock. Вся графика размещается на панели Grid, имеющей фиксированный размер с 200-пиксельными значениями Width и Height; таким образом, радиус внутреннего циферблата составит 100 пикселов:

Внутри Grid размещаются пять элементов Path, которые рисуют деления по окружности часов, а также часовую, минутную и секундную стрелки. Все они базируются на координатной системе со значениями координат X и Y в диапазоне от -100 до 100. Если бы в окне приложения отображалась панель Grid (обведенная синим контуром) и циферблат, это выглядело бы так:

Стартовая позиция элемента Grid в приложении AnalogClock

Панель Grid по умолчанию расположена в центре страницы, но центр часов располагается в левом верхнем углу Grid, где находится точка (0,0). Теперь мы поместим панель Grid в Viewbox:

Элемент Viewbox правильно работает с элементами, у которых начало координат расположено в левом верхнем углу, но не с графикой с отрицательными координатами:

Позиционирование Viewbox в приложении AnalogClock

К счастью, проблема решается относительно просто - простым сдвигом Grid и циферблата. Преобразование выполняется до того, как Viewbox найдет элемент, поэтому величина смещения составляет всего 100 пикселов:

Результат выглядит так:

Окончательное позиционирование элементов в приложении AnalogClock

Часы состоят из пяти элементов Path. Каждая из трех стрелок определяется синтаксисом разметки, состоящим из прямых линий и кривых Безье. Ниже приведено определение часовой стрелки, указывающей на 12:00. Так как большая часть стрелки располагается в верхней половине часов, координаты Y в основном имеют отрицательные значения:

Для вывода делений используются пунктирные линии. Элемент Path для малых делений выглядит так:

Разметка создает окружность с радиусом 90; соответственно длина окружности составит 2π90. Таким образом, 60 делений разделяются расстоянием 3π - произведением StrokeThickness и числа в StrokeDashArray, обозначающего расстояние между точками в единицах StrokeThickness.

После этого вы без труда поймете определение Path для больших делений:

И снова длина окружности составляет 2π90, однако делений на этот раз всего 12. Они разделяются расстоянием 15π, достаточно близким к произведению 6 и 7,854. Итак, соберем все вместе:

Файл фонового кода отвечает за вычисление углов, измеряемых по часовой стрелке от положений 12:00 для трех объектов RotateTransform:


Для самого окна сделаем размер: 350px на 350px в окне свойств.

Свойство FormBorderStyle для окна формы поставим в значение None, чтобы убрать границу у окна нашей программы.

Добавим на форму из Панели элементов PictureBox . Поставим так же размеры для PictureBox 350 и 350.

Свойство SizeMode для PictureBox установим в Zoom. Это растянет нашу картинку на всё окно формы. Свойство Dock установим в Fill. Это означает, что наша картинка будет размещена по центру окна формы.

Уже можно загрузить саму картинку циферблата. Будем использовать вот это изображение формата gif:

Загружаем данное изображение в свойство Image для PictureBox. Выбираем Локальный ресурс->Импорт.

Настраиваем перемещение окна с помощью мыши.

Подключаем функции из библиотеки user32.dll, которые помогут нам переносить окно с помощью мышки, кликая в любой точки этого окна.

А так же подключим обработчик события MouseDown (нажатия клавиши мыши) для нашей PictureBox. Кликаем на вкладку конструктор, выбираем в свойствах именно форму и нажимаем кнопку со значком молния . Там ищем событие MouseDown и кликаем два раза на поле, которое напротив слова MouseDown.

В появившийся функции обработчика события пропишем следующий код:

Запустим программу и увидим, что теперь можно перемещать окно, кликая по любой точке картинки.

Настраиваем прозрачность окна.

Чтобы у нас была только картинка циферблата, и не было видно самого окна, настроим прозрачность окна.

Формируем таймер и стрелки.

Заведём необходимые переменные:

secHAND, minHAND, hrHAND - это длина в пикселях секундной стрелки, минутной и часовой соответственно.

Так же завели таймер t.

Перейдём в обработчик события Load (загрузка) для самой формы (по аналогии, как мы делали обработчик события MouseDown).

Теперь каждую секунду будет запускаться функция t_Tick(), которую мы пропишем ниже.

Стрелки будут идти от центра картинки. Центр имеет координаты x=175 (350/2), y=175 (350/2). Начало координат находится в верхнем левом углу.

Напишем функцию msCoord, которая будет получать количество секунд (или минут) и длину стрелки, а возвращать координаты конца секундной(минутной) стрелки.

При отклонении на 1 секунду (или минуту), стрелка отклоняется на 6 градусов (360/60). В начале, функция узнаёт на сколько градусов отклоняется стрелка от начального положения (цифры 12).

Если прошло 5 секунд, стрелка отклонилась на 30 градусов. Тогда координата x=cx+l*sin(30), a y=cy-l*cos(30), где l-длина стрелки, cx и cy - центр картинки. Градусы нужно указывать в радианах (умножаем на пи и делим на 180 градусов угол отклонения).

В функции так же учтены знаки для синуса и косинуса для разных четвертей окружности. Так же учтено, когда нужно вычитать от сx и cy, а когда прибавлять.

Напишем функцию для получения координат конца часовой стрелки.

Эта функция принимает и часы и минуты. Для часовой стрелки: 1 час - это 30 градусов (360/12), а одна минута - это 0.5 градусов.


1 час - 30 градусов
1/60 часа (1 минута) - x градусов

x = 1/60*30 = 0.5 градусов.

В остальном работает так же, как предыдущая функция.

Напишем главную функцию t_Tick.

В начале функции берём системное время (часы, минуты, секунды). Создаём объект g типа Graphics, который позволит рисовать на нашей картинке (циферблате).

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

Затем уже, рисуем линии стрелок часов с нормальной толщиной и нужными нами цветами.

Каждую секунду стрелки прорисовываются заново. Для часов подставляем остаток от деления на 12 (h % 12), чтобы учесть, что 22-это 10 часов.

Программа по созданию стрелочных часов. Минимальные требования к составу и параметрам технических средств программы. Выбор и обоснование системы программирования Microsoft Visual Studio. Общее описание алгоритма. Руководство пользователя и программиста.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 11.12.2012
Размер файла 1017,1 K

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

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

В пояснительной записке были описаны входные и выходные данные, основные процедуры и их параметры.

В процессе выполнения работы была разработана схема программы, блок-схема.

1 Анализ исходных данных и разработка ТЗ

1.1 Основание и назначение разработки

Основанием для разработки данной программы является потребность пользователя в любое время узнавать, сколько времени, не отрываясь от дел на компьютере.

1.2 Минимальные требования к составу и параметрам технических средств: ЭВМ, внешние устройства

Минимальные требования к составу и параметрам технических средств определяются операционной системой:

· Оперативная память 64Мb

1.3 Требования к информационной и программной совместимости

· ОС Windows 98SE и выше.

· Office 2000 и выше

· Поддержка национальных шрифтов (кириллицы)

1.4 Требования к функциональным характеристикам

Программа должна выполнять следующие функции:

· Правильно определять и показывать время в соответствии с временем на компьютере.

· Закрывать часы при нажатии на кнопку.

1.5 Выбор и обоснование системы программирования и используемых программных средств

Для выполнения данного задания использовался алгоритмический язык программирования Microsoft Visual Studio 10.0. Данный выбор обусловлен использованием язык VB в пакете Microsoft Office.

2. Внешняя спецификация.

В программе применяются следующие типы входных данных:

· Integer (для хранения целых чисел)

· DateTime (для хранения / определения времени)

2.2 Выходные данные

Программа рисует на форме графическое изображение часов.

2.3 Общее описание алгоритма

1. При запуске программы мы видим стрелочные часы с часовой, минутной и секундной стрелкой.

2. Часы показывают время данного компьютера.

3. Чтобы выйти из программы, нажимаем кнопку «Выход».

2.4 Основной алгоритм программы

Программа по созданию стрелочных часов построена по следующему алгоритму:

· Делаем прозрачным задний фон.

· Переносим начало координат в центр.

· Оформляем часы - рисуем штрихи, обозначающие часы и минуты, цифры на часах.

· Узнаем сколько времени.

· Рисуем секундную, минутную и часовую стрелки.

· Выясняем соотношение градусов.

· Принудительная перерисовка через 1 секунду.

· Создаем кнопку для закрытия программы.

2.5 Функциональная схема программы

3. Руководство пользователя

стрелочный часы программа алгоритм

3.1 Назначение программы

Потребность пользователя в любое время узнавать, сколько времени.

3.2 Описание интерфейса. Требования к входным данным

При запуске программы на экране появляются Стрелочные часы (рис. 1).

На форме расположены: кнопка «Выход», таймер «Timer1».

4. Руководство программиста

4.1 Организация ввода данных в программу и вывода результатов

В данную программу не данные не вводятся, то есть нет пользовательских данных.

4.2 Блок-схема программы

4.3 Описание процедур и их параметры

Очищает всю поверхность рисования и выполняет заливку поверхности указанным цветом фона.

TranslateTransform()

Изменяет начало координат координатной системы

FillEllipse()

Заполняет внутреннюю часть эллипса, определяемого ограничивающим прямоугольником, заданным с помощью пары координат, ширины и высоты.

DrawEllipse()

Рисует эллипс, определяемый ограничивающим прямоугольником, заданным с помощью координат для верхнего левого угла прямоугольника, высоты и ширины.

DrawLine()

Проводит линию, соединяющую две точки, задаваемые парами координат.

RotateTransform()

Применяет заданное вращение к матрице преобразования данного объекта

DrawString()

Создает указываемую текстовую строку в заданном месте

Invalidate()

Делает недействительной всю поверхность элемента управления и вызывает его перерисовку.

Close() Закрывает форму.

ResetTransform()

Сбрасывает матрицу универсального преобразования данного объекта и делает ее единичной матрицей

TranslateTransform()

Изменяет начало координат координатной системы путем добавления заданного сдвига к матрице преобразования данного объекта

RotateTransform()

Применяет заданное вращение к матрице преобразования данного объекта

FillPolygon()

Заполняет внутреннюю часть многоугольника, определяемого массивом точек, заданных структурами

4.4 Настройка программы

Программа оптимизирована и никаких настроек не требует.

4.5 Структура программы

Form1 содержит код программы, который рисует часы

Список источников

3. Лукин С.Н. «VB 6.0.» - издательство М.:Диалог - МИФИ», 2001 г.

Приложения

Код программы с комментариями.

Public Class Form1

Protected Overrides Sub OnPaintBackground (ByVal pevent As System. Windows. Forms. PaintEventArgs)

'OnPaintBackground делает перерисовку быстрее чем событие OnPaint

'если очень много рисуем, лучше это делать тут.

Dim g As Graphics = pevent. Graphics()

Dim pen1 As New Pen (Color. Black, 1)

Dim h As Integer = Me. ClientSize. Height 'вертикаль

Dim w As Integer = Me. ClientSize. Width 'горизонталь

'заливка формы белым цветом

g. Clear (Color. White)

'Делаем прозрачным задний фон

Me. TransparencyKey = Color. White

'перенос начала координат в центр

g. TranslateTransform (Me. ClientSize. Width * 0.5, Me. ClientSize. Height * 0.5)

g. FillEllipse (Brushes. SaddleBrown, -100, -100, 200, 200)

g. FillEllipse (Brushes. Peru, -95, -95, 190, 190)

g. FillEllipse (Brushes. LemonChiffon, -90, -90, 180, 180)

g. DrawEllipse (Pens. Black, -90, -90, 180, 180)

g. DrawEllipse (Pens. Black, -85, -85, 170, 170)

'штрихи обозначающие часы и минуты

Dim i As Integer

g. DrawLine (pen1, (199 \ 2) - (90 \ 10), 0, 80, 0)

Dim p As Integer

g. DrawLine (pen1, (84), 0, 90, 0)

'Рисуем цифры на часах

g. DrawString («1», Me. Font, Brushes. Black, 30, -70)

g. DrawString («2», Me. Font, Brushes. Black, 58, -42)

g. DrawString («3», Me. Font, Brushes. Black, 69, -6)

g. DrawString («4», Me. Font, Brushes. Black, 59, 31)

g. DrawString («5», Me. Font, Brushes. Black, 30, 58)

g. DrawString («6», Me. Font, Brushes. Black, -5, 65)

g. DrawString («7», Me. Font, Brushes. Black, -40, 57)

g. DrawString («8», Me. Font, Brushes. Black, -68, 31)

g. DrawString («9», Me. Font, Brushes. Black, -78, -6)

g. DrawString («10», Me. Font, Brushes. Black, -68, -43)

g. DrawString («11», Me. Font, Brushes. Black, -40, -70)

g. DrawString («12», Me. Font, Brushes. Black, -8, -78)

Private Sub Form1_Load (ByVal sender As Object, ByVal e As System. EventArgs) Handles MyBase. Load

'двойная буферизация, убирает мерцание при перерисовке

SetStyle (ControlStyles. UserPaint, True)

SetStyle (ControlStyles. AllPaintingInWmPaint, True)

SetStyle (ControlStyles. DoubleBuffer, True)

Private Sub Timer1_Tick (ByVal sender As System. Object, ByVal e As System. EventArgs) Handles Timer1. Tick

'принудительная перерисовка, через 1 секунду

Private Sub Form1_Paint (ByVal sender As Object, ByVal e As System. Windows. Forms. PaintEventArgs) Handles MyBase. Paint

'здесь ходят стрелки часов

Dim g As Graphics = e. Graphics

Dim brush1 As Brush = New SolidBrush (Color. Red)

Dim brush2 As Brush = New SolidBrush (Color. Black)

Dim brush3 As Brush = New SolidBrush (Color. Brown)

'узнаем сколько время

Dim t As New DateTime()

t = DateTime. Now

Dim wh As New Size (Me. ClientSize. Width * 0.5, Me. ClientSize. Height * 0.5)

Dim j As Integer = Me. ClientSize. Height

If j > Me. ClientSize. Width Then j = Me. ClientSize. Width

j *= 0.15 'Коэфицент размера стрелок

'рисуем cекундную стрелку

Dim ps1 As New Point (0, 0)

Dim ps2 As New Point (0, 1.3)

Dim ps3 As New Point (j * 1.7, 0)

Dim ps4 As New Point (j * 1.7, 1.3)

Dim ps5 As New Point (-j * 0.7, 1.3)

Dim ps6 As New Point (-j * 0.7, 0)

Dim psts As Point() =

'рисуем минутную стрелку

Dim pm1 As New Point (0, 0)

Dim pm2 As New Point (0, 1.5)

Dim pm3 As New Point (j * 1.5, 0)

Dim pm4 As New Point (j * 1.5, 1.5)

Dim pm5 As New Point (-j * 0.5, 1.5)

Dim pm6 As New Point (-j * 0.5, 0)

Dim pmts As Point() =

'рисуем часовою стрелку

Dim ph1 As New Point (0, 0)

Dim ph2 As New Point (0, 1.5)

Dim ph3 As New Point (j * 1.2, 0)

Dim ph4 As New Point (j * 1.2, 1.5)

Dim ph5 As New Point (-j * 0.3, 1.5)

Dim ph6 As New Point (-j * 0.3, 0)

Dim phts As Point() =

'выясняем соотношение градусов к минутам

'используется вычет 90 градусов, так как по умолчанию 0 градусов на 3 часах

'360 на 60 секунд, 6 градусов в секунду

g. TranslateTransform (wh. Width, wh. Height)

g. RotateTransform (t. Second * 6 - 90)

g. FillPolygon (brush1, psts)

'360 на 60 минут, 6 градусов в минуту

g. TranslateTransform (wh. Width, wh. Height)

g. RotateTransform (t. Minute * 6 - 90)

g. FillPolygon (brush2, pmts)

'360 на 12 часов, 30 градусов в час

'стрелку часов рисуем по другому немного, чтобы она зависела от кол-ва минут

g. TranslateTransform (wh. Width, wh. Height)

g. RotateTransform((t. Hour * 30 - 90) + (t. Minute * 0.5))

g. FillPolygon (brush3, phts)

Private Sub Button1_Click (ByVal sender As System. Object, ByVal e As System. EventArgs) Handles Button1. Click

Подобные документы

Среда программирования Embarcadero RAD Studio. Создание окна, которое отображает системную дату и время. Выполнение выбранного действия в определенный промежуток времени, заданный пользователем. Руководство программиста. Минимальные системные требования.

курсовая работа [85,2 K], добавлен 16.06.2014

Microsoft Visual C++ и среда программирования Microsoft Developer Studio 6.0. Решение интеллектуальной задачи на компьютере. Построение алгоритма кодирования на Visual C++. Алгоритм решения задачи. Описание программы "Sort". Инструкции пользователя.

курсовая работа [46,0 K], добавлен 27.11.2007

курсовая работа [500,4 K], добавлен 13.01.2015

курсовая работа [1,2 M], добавлен 25.04.2012

Общие сведения о работе программы в среде программирования Microsoft Visual Studio 2008, на языке программирования C++. Ее функциональное назначение. Инсталляция и выполнение программы. Разработанные меню и интерфейсы. Алгоритм программного обеспечения.

курсовая работа [585,5 K], добавлен 24.03.2009

Требования к функциональным характеристикам программы, составу и параметрам технических средств, программной совместимости. Особенности программирования в среде Access. Описание интерфейса программы, ввод и редактирование данных, добавление новых книг.

курсовая работа [1,5 M], добавлен 17.11.2010

Изучение особенностей растровых и векторных графических редакторов. Создание графического редактора: выбор языка программирования, разработка структуры программы и алгоритма работы. Описание интерфейса программы. Руководство программиста и пользователя.

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

Сегодня мы создадим программу, которая будет при запуске показывать нам цифровые часы и дату.

Для начала создаём форму. У нас она такая:

Теперь переходим к коду, щёлкнув правой кнопкой мыши по форме и выбрав соответствующую команду.

Сразу после строки public partial class Form1 : Form объявим таймер. Делается это так:

Объявляем мы его в самом начале, чтобы все функции, которые у нас будут внутри, принимали его в расчёт (если он будет объявлен в какой-то одной отдельной функции, то вторая функция не будет его видеть).

Теперь рам надо включить наш таймер. Для этого мы возвращаемся в форму и дважды щёлкаем на неё левой кнопкой мыши.

Нас переносит в код, который будет срабатывать при загрузке формы (то есть, с самого начала работы программы). Здесь мы пишем следующее:

private void Form1_Load ( object sender , EventArgs e )

Первая строка устанавливает интервал обновления таймера. Число 1000 означает, что таймер будет обновляться каждые 1000 миллисекунд, т.е. каждую секунду.

Третьей строкой мы запускаем наш таймер.

Теперь мы возвращаемся в форму и дважды кликаем на значке таймера ( ) внизу.

Вот и открылась у нас функция timer1_Tick. Мы запишем в неё определённый код, и каждые 1000 миллисекунд этот код будет исполняться заново.

Внутри нашей функции мы сначала объявим некоторые переменные:

Переменная строкового типа time нам нужна, чтобы мы записали первые три переменные в строку для вывода в форму.

Дело в том, что мы привыкли видеть форму времени в виде, грубо говоря, 00:00:00 , то есть две цифры на вывод часов, две цифры на минуты и две цифры на секунды (например, 06:03:09 или 12:01:05).Время же из свойства DateTime.Now не имеет нулей перед цифрами, которые меньше десяти (иначе говоря, время будет выглядеть так: 6:3:9 или 12:1:5). Согласитесь, это не очень удобно и привычно видеть. Поэтому мы исправим благодаря оператору условия if.

Сначала мы задаём условие, что если h<10, то есть если часы показывают время от 0 до 9 часов, то в таком случае в строку time мы добавляем перед h ноль, чтобы у нас получилось не просто время 5 часов, а 05 часов. Иначе (else) мы просто добавляем в time переменную h без нулей.

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

Теперь давайте, для большего понимания, что мы сделали, поговорим о работе строки time. Мы поочерёдно записываем в неё часы (с нулём или без), минуты (аналогично) и секунды (аналогично). Между ними мы ставим двоеточие. Именно поэтому после первых двух условий у нас имеются строки

Однако пока что наша строка просто существует, но пользователь не видит её, не видит, сколько время в данный момент.

Поэтому мы выводим нашу строку в форму через Label. У нас это label2, с наиболее крупным шрифтом.

Читайте также: