Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
182.89 Кб
Скачать

5. Инструкция Пользователя

5.1. Запуск приложения

Для запуска приложения выполните двойное нажатие левой кнопкой мыши на файле Clock2JavaToCS.exe. После этого перед вами откроется окно приложения с настройками по умолчанию как показано на рисунке 5.1.

Рисунок 5.1. – Главное окно приложения

5.2. Основные элементы приложения

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

Для отображения дополнительных элементов управления необходимо навести указатель мыши на циферблат часов. Дополнительные элементы отображены на рисунке 5.2

Рисунок 5.2 – Дополнительные элементы приложения

5.3. Управление главным окном приложения

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

Для сворачивания главного окна приложения наведите указатель мыши на циферблат часов, после чего вокруг циферблата отобразится панель с дополнительными элементами управления (рисунок 5.2). На появившейся панели нажмите кнопку, показанную на рисунке 5.3, после чего окно приложения свернется.

Рисунок 5.3 – Кнопка свернуть

5.4. Настройка приложения

Для настройки приложения наведите указатель мыши на циферблат часов, после чего вокруг циферблата отобразится панель с дополнительными элементами управления (рисунок 5.2). На появившейся панели нажмите кнопку, показанную на рисунке 5.4, после чего появится окно настройки приложения, как показано на рисунке 5.5.

Рисунок 5.4 – Кнопка настройки приложения

Рисунок 5.5 – Окно настройки приложения

Для настройки отображения элементов часов в группе «Настройка отображения элементов часов» поставьте или уберите галочку напротив соответствующего элемента. Наличие галочки соответствует отображению элемента, отсутствие – его сокрытию.

Для изменения размера часов необходимо изменять их радиус путем задания соответствующего значения в поле «Радиус» группы «Настройка размеров часов».

Если необходимо изменить цветовую схему часов в группе «Настройка стиля» из выпадающего списка выберите один из доступных цветов циферблата.

Для сброса всех настроек к параметрам по умолчанию нажмите кнопку «По умолчанию».

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

Для сохранения выполненных настроек приложения нажмите кнопку «Сохранить», настройки будут сохранены в файл и при следующем запуске приложения будут применены.

Когда работа с настройками будет закончена, закройте окно «Настройки» нажмите на «крестик» в правом верхнем углу соответствующего окна.

Приложение а

Текст программы класса

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Shapes;

using System.Windows.Threading;

namespace Clock2JavaToCS

{

public class Clock : FrameworkElement

{

private double r;//радиус циферблата

public double Radius { get { return r; } }

private DateTime currentDataTime;

public DateTime CurrentDataTime { get { return currentDataTime; } }

private double xcenter, ycenter;//координаты центра

private int Hour, Minutes, Seconds;

private int lastxs, lastys, lastxm, lastym, lastxh, lastyh;

private bool drag = false;

private Point startpoint = new Point(0, 0);

public Canvas ParrentCanvas;//канва на которой расположены часы

public Ellipse CircleOfDial;//окружность циферблата

public TextBlock TBDate;

public TextBlock TBTime;

private TextBlock[] NumberHour;

public Line HourArrow, HourArrow1, MinutesArrow, MinutesArrow1, SecondsArrow;

private StackPanel PanelControlBtn;

private Button btnOption, btnClose, btnMinimazed;

private OptionWin OptionWindow;

public ClockConfig clockConfig;

private Thread TimerOfClock;

private double MinR = 120, MaxR = 350;

private ThreadStart threadStartClock;

public Clock()

{

lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0;

ParrentCanvas = new Canvas();

ParrentCanvas.Opacity = 100;

//рисуем циферблат

CircleOfDial = new Ellipse();

//цифры часов

NumberHour = new TextBlock[4];

for (int i = 0; i < NumberHour.Length; i++)

NumberHour[i] = new TextBlock();

//стрелки

HourArrow = new Line();

HourArrow1 = new Line();

MinutesArrow = new Line();

MinutesArrow1 = new Line();

SecondsArrow = new Line();

//поле для даты и времени

TBDate = new TextBlock();

TBTime = new TextBlock();

TBDate.TextAlignment = TextAlignment.Center;

TBTime.TextAlignment = TextAlignment.Center;

//настройка событий перемещения окна и появления кнопок

CircleOfDial.AllowDrop = true;

ParrentCanvas.AllowDrop = true;

ParrentCanvas.MouseDown += Shape_MouseDown;

ParrentCanvas.MouseMove += Shape_MouseMove;

ParrentCanvas.MouseUp += Shape_MouseUp;

ParrentCanvas.MouseEnter += ParrentCanvas_MouseEnter;

ParrentCanvas.MouseLeave += Shape_MouseLeave;

//настройка кнопок управления приложением

PanelControlBtn = new StackPanel() { Height = 60, Width = 20, Visibility = Visibility.Hidden };

btnClose = new Button() { Content = "X", Height = 20, Width = 20 };

btnOption = new Button() { Content = "...", Height = 20, Width = 20 };

btnMinimazed = new Button() { Content = "-", Height = 20, Width = 20 };

btnClose.Click += BtnClose_Click;

btnMinimazed.Click += btnMinimazed_Click;

btnOption.Click += BtnOption_Click;

PanelControlBtn.Children.Add(btnClose);

PanelControlBtn.Children.Add(btnMinimazed);

PanelControlBtn.Children.Add(btnOption);

//добавление на канву всех элементов

ParrentCanvas.Children.Add(CircleOfDial);

ParrentCanvas.Children.Add(HourArrow);

ParrentCanvas.Children.Add(HourArrow1);

ParrentCanvas.Children.Add(MinutesArrow);

ParrentCanvas.Children.Add(MinutesArrow1);

ParrentCanvas.Children.Add(SecondsArrow);

ParrentCanvas.Children.Add(TBDate);

ParrentCanvas.Children.Add(TBTime);

ParrentCanvas.Children.Add(NumberHour[0]);

ParrentCanvas.Children.Add(NumberHour[1]);

ParrentCanvas.Children.Add(NumberHour[2]);

ParrentCanvas.Children.Add(NumberHour[3]);

ParrentCanvas.Children.Add(PanelControlBtn);

//загрузка настроек из файла

threadStartClock = new ThreadStart(RepaintTime);

clockConfig = new ClockConfig();

Clock _tempClock = this;

clockConfig.LoadConfig(ref _tempClock);

//запуск потока

TimerOfClock = new Thread(ThreadTimerOfClock);

TimerOfClock.IsBackground = true;

TimerOfClock.Start();

}

#region Обработчики событий для кнопок

private void btnMinimazed_Click(object sender, RoutedEventArgs e)

{

try

{

if (ParrentCanvas.Parent is Window)

{

(ParrentCanvas.Parent as Window).WindowState = WindowState.Minimized;

}

}

catch (Exception exc)

{

throw new ClockException("Возникла неизвестная ошибка. (" + exc.Message + ").");

}

}

private void BtnOption_Click(object sender, RoutedEventArgs e)

{

try

{

Clock tempClock = this;

OptionWindow = new OptionWin(ref tempClock);

OptionWindow.ShowDialog();

}

catch (Exception exc)

{

throw new ClockException("Возникла неизвестная ошибка. (" + exc.Message + ").");

}

}

private void BtnClose_Click(object sender, RoutedEventArgs e)

{

try

{

App.Current.Shutdown();

}

catch (Exception exc)

{

throw new ClockException("Возникла неизвестная ошибка. (" + exc.Message + ").");

}

}

#endregion

#region Перемещение формы и появление кнопок

private void Shape_MouseLeave(object sender, MouseEventArgs e)

{

drag = false;

ParrentCanvas.Opacity = 100;

ParrentCanvas.Background = Brushes.Transparent;

PanelControlBtn.Visibility = Visibility.Hidden;

}

private void ParrentCanvas_MouseEnter(object sender, MouseEventArgs e)

{

PanelControlBtn.Visibility = Visibility.Visible;

ParrentCanvas.Opacity = 100;

ParrentCanvas.Background = Brushes.WhiteSmoke;

}

private void Shape_MouseUp(object sender, MouseButtonEventArgs e)

{

drag = false;

}

private void Shape_MouseMove(object sender, MouseEventArgs e)

{

if (drag)

{

Window tmpWin = ((sender as Canvas).Parent as Window);

double X = Mouse.GetPosition(tmpWin).X;

double Y = Mouse.GetPosition(tmpWin).Y;

Point p1 = new Point(X, Y);

Point p2 = tmpWin.PointToScreen(p1);

Point p3 = new Point(p2.X - startpoint.X, p2.Y - startpoint.Y);

tmpWin.Left = p3.X;

tmpWin.Top = p3.Y;

}

}

private void Shape_MouseDown(object sender, MouseButtonEventArgs e)

{

double X, Y;

if (sender is Canvas)

{

drag = true;

X = Mouse.GetPosition((sender as Canvas).Parent as Window).X;

Y = Mouse.GetPosition((sender as Canvas).Parent as Window).Y;

startpoint = new Point(X, Y);

}

}

#endregion

#region Основные функции класса

public void SetSizeClock(double _r)

{

try

{

if ((_r < MinR) || (_r > MaxR))

throw new EClockSize("Радиус часов должен лежать в диапозоне от " + MinR.ToString() + " до " +

MaxR.ToString() + "!");

r = _r;

ParrentCanvas.Height = (r * 2) + 40;

ParrentCanvas.Width = (r * 2) + 40;

xcenter = ParrentCanvas.Width / 2;

ycenter = ParrentCanvas.Height / 2;

TBDate.Width = r + 0.2 * r;

TBDate.Height = 20;

TBTime.Width = r;

TBTime.Height = 20;

CircleOfDial.Height = r * 2;

CircleOfDial.Width = r * 2;

if (r >= 150)

{

HourArrow.StrokeThickness = 2;

HourArrow1.StrokeThickness = 2;

MinutesArrow.StrokeThickness = 2;

MinutesArrow1.StrokeThickness = 2;

SecondsArrow.StrokeThickness = 1.3;

}

else

{

HourArrow.StrokeThickness = 1;

HourArrow1.StrokeThickness = 1;

MinutesArrow.StrokeThickness = 1;

MinutesArrow1.StrokeThickness = 1;

SecondsArrow.StrokeThickness = 1;

}

//компановка элементов на канве

Canvas.SetLeft(PanelControlBtn, ParrentCanvas.Width - PanelControlBtn.Width);

Canvas.SetTop(PanelControlBtn, 0);

Canvas.SetLeft(CircleOfDial, xcenter - r);

Canvas.SetTop(CircleOfDial, ycenter - r);

Canvas.SetTop(TBDate, ycenter + (r - TBDate.Height * 2.5));

Canvas.SetLeft(TBDate, xcenter - TBDate.Width / 2);

Canvas.SetLeft(TBTime, xcenter - TBTime.Width / 2);

Canvas.SetTop(TBTime, ycenter + (r - TBTime.Height * 3.5));

DrawNumberHour();

}

catch (EClockSize e)

{

throw e;

}

catch (Exception e)

{

throw new ClockException("Возникла неизвестная ошибка при попытке изменить размер часов. (" + e.Message + ").");

}

}

private void ThreadTimerOfClock()

{

try

{

while ((App.Current != null) || (Parent != null) || (Dispatcher != null))

{

Dispatcher.Invoke(DispatcherPriority.Normal, threadStartClock);

Thread.Sleep(100);

}

}

catch (Exception e)

{

throw new ClockException("Возникла неизвестная ошибка при попытке обновить состояние часов в потоке. (" + e.Message + ").");

}

}

private void DrawNumberHour()

{

NumberHour[0].Text = "9";

Canvas.SetLeft(NumberHour[0], xcenter - (r - 20));

Canvas.SetTop(NumberHour[0], ycenter - 6);

NumberHour[1].Text = "3";

Canvas.SetLeft(NumberHour[1], xcenter + (r - 20));

Canvas.SetTop(NumberHour[1], ycenter - 6);

NumberHour[2].Text = "12";

Canvas.SetLeft(NumberHour[2], xcenter - 5);

Canvas.SetTop(NumberHour[2], ycenter - (r - 13));

NumberHour[3].Text = "6";

Canvas.SetLeft(NumberHour[3], xcenter - 3);

Canvas.SetTop(NumberHour[3], ycenter + (r - 20));

foreach (TextBlock textBlock in NumberHour)

{

textBlock.Foreground = Brushes.Black;

textBlock.FontWeight = FontWeights.Bold;

}

}

public void SetColor(Brush _color)

{

try

{

CircleOfDial.Fill = _color;

if ((CircleOfDial.Fill.ToString() == Brushes.Yellow.ToString()) || (CircleOfDial.Fill.ToString() == Brushes.White.ToString()))

{

TBDate.Foreground = Brushes.Black;

TBTime.Foreground = Brushes.Black;

}

else

{

TBDate.Foreground = Brushes.White;

TBTime.Foreground = Brushes.White;

}

CircleOfDial.Stroke = Brushes.Black;

SecondsArrow.Stroke = Brushes.Black;

MinutesArrow.Stroke = Brushes.Black;

MinutesArrow1.Stroke = Brushes.Black;

HourArrow.Stroke = Brushes.Black;

HourArrow1.Stroke = Brushes.Black;

}

catch (Exception E)

{

throw new EClockColor("Ошибка задания цветовых настроек часов (" + E.Message + ").");

}

}

public void RepaintTime()

{

try

{

int xs, ys, xm, ym, xh, yh;

currentDataTime = DateTime.Now;

TBDate.Text = currentDataTime.ToLongDateString();

TBDate.Text = TBDate.Text + " " + currentDataTime.DayOfWeek.ToString();

TBTime.Text = currentDataTime.ToLocalTime().ToLongTimeString();

Minutes = DateTime.Now.Minute;

Seconds = DateTime.Now.Second;

Hour = DateTime.Now.Hour;

xs = (int)(Math.Cos(Seconds * 3.14f / 30 - 3.14f / 2) * (r - 50) + xcenter);

ys = (int)(Math.Sin(Seconds * 3.14f / 30 - 3.14f / 2) * (r - 50) + ycenter);

xm = (int)(Math.Cos(Minutes * 3.14f / 30 - 3.14f / 2) * (r - 70) + xcenter);

ym = (int)(Math.Sin(Minutes * 3.14f / 30 - 3.14f / 2) * (r - 70) + ycenter);

xh = (int)(Math.Cos((Hour * 30 + Minutes / 2) * 3.14f / 180 - 3.14f / 2) * (r - 85) + xcenter);

yh = (int)(Math.Sin((Hour * 30 + Minutes / 2) * 3.14f / 180 - 3.14f / 2) * (r - 85) + ycenter);

if ((xs != lastxs || ys != lastys) && (lastxs != 0 || lastys != 0))

{

SecondsArrow.X1 = xcenter;

SecondsArrow.Y1 = ycenter;

SecondsArrow.X2 = lastxs;

SecondsArrow.Y2 = lastys;

}

if ((xm != lastxm || ym != lastym) && (lastxm != 0 || lastym != 0))

{

MinutesArrow.X1 = xcenter;

MinutesArrow.Y1 = ycenter - 1;

MinutesArrow.X2 = lastxm;

MinutesArrow.Y2 = lastym;

MinutesArrow1.X1 = xcenter - 1;

MinutesArrow1.Y1 = ycenter;

MinutesArrow1.X2 = lastxm;

MinutesArrow1.Y2 = lastym;

}

if ((xh != lastxh || yh != lastyh) && (lastxh != 0 || lastyh != 0))

{

HourArrow.X1 = xcenter;

HourArrow.Y1 = ycenter - 1;

HourArrow.X2 = lastxh;

HourArrow.Y2 = lastyh;

HourArrow1.X1 = xcenter - 1;

HourArrow1.Y1 = ycenter;

HourArrow1.X2 = lastxh;

HourArrow1.Y2 = lastyh;

}

SecondsArrow.X1 = xcenter;

SecondsArrow.Y1 = ycenter;

MinutesArrow.X1 = xcenter;

MinutesArrow.Y1 = ycenter - 1;

MinutesArrow1.X1 = xcenter - 1;

MinutesArrow1.Y1 = ycenter;

HourArrow.X1 = xcenter;

HourArrow.Y1 = ycenter - 1;

HourArrow1.X1 = xcenter - 1;

HourArrow1.Y1 = ycenter;

SecondsArrow.X2 = xs;

SecondsArrow.Y2 = ys;

MinutesArrow.X2 = xm;

MinutesArrow.Y2 = ym;

MinutesArrow1.X2 = xm;

MinutesArrow1.Y2 = ym;

HourArrow.X2 = xh;

HourArrow.Y2 = yh;

HourArrow1.X2 = xh;

HourArrow1.Y2 = yh;

lastxs = xs; lastys = ys;

lastxm = xm; lastym = ym;

lastxh = xh; lastyh = yh;

}

catch (Exception e)

{

throw new ClockException("Возникла неизвестная ошибка при перерисовке часов. (" + e.Message + ").");

}

}

#endregion

}

#region Исключительные ситуации

public class ClockException : Exception

{

public ClockException(string _Message)

: base(_Message)

{

}

}

public class EClockSize : ClockException

{

public EClockSize(string _Message)

: base(_Message)

{

}

}

public class EClockColor : ClockException

{

public EClockColor(string _Message)

: base(_Message)

{

}

}

#endregion

}

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