2018年05月14日
《その385》時計の作成
時計の作成
本ブログの《383》《384》で、時計作成のための準備は完了しているので、今回は、実際に 時計の形にまとめてみました。
以下は、MainPage.xaml.cpp です。
//
// MainPage.xaml.cpp
// MainPage クラスの実装。
//
#include "pch.h"
#include "MainPage.xaml.h"
using namespace App5;
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;
float pi = 3.1416f;
int s = 0; int m = 0; int h = 0; // 秒,分,時
float len_s = 140; // 秒針の長さ
float len_m = 115; // 分針の長さ
float len_h = 90; // 時針の長さ
// 秒針・分針・時針 先端の x座標と y座標
float xs = 0; float ys = 0;
float xm = 0; float ym = 0;
float xh = 0; float yh = 0;
// 時計中心の x座標と y座標
float xc = 150; float yc = 150;
MainPage::MainPage() {
InitializeComponent();
// 文字盤
Shapes::Ellipse^ circle;
circle = ref new Shapes::Ellipse();
circle->Width = 300;
circle->Height = 300;
circle->Fill
= ref new SolidColorBrush(Windows::UI::Colors::Beige);
canvas1->Children->Append(circle);
// 時間目盛り
for (int i = 0; i < 12; i++) {
auto line = ref new Shapes::Line();
line->Stroke
= ref new SolidColorBrush(Windows::UI::Colors::Gray);
if (i % 3)
line->StrokeThickness = 2;
else
line->StrokeThickness = 4;
line->X1 = 150 + 130 * cos((90 - 30 * i) * pi / 180);
line->Y1 = 150 - 130 * sin((90 - 30 * i) * pi / 180);
line->X2 = 150 + 150 * cos((90 - 30 * i) * pi / 180);
line->Y2 = 150 - 150 * sin((90 - 30 * i) * pi / 180);
canvas1->Children->Append(line);
}
// Canvas 位置
canvas1->Margin = Thickness(50, 20, 0, 0);
canvas2->Margin = Thickness(50, 20, 0, 0);
canvas3->Margin = Thickness(50, 20, 0, 0);
canvas4->Margin = Thickness(50, 20, 0, 0);
StartTimer();
}
// 時・分・秒の取得
void func() {
int temp = s;
do {
time_t timeUTC = time(NULL);
struct tm local;
localtime_s(&local, &timeUTC);
s = local.tm_sec;
m = local.tm_min;
h = local.tm_hour;
} while (s == temp);
}
// 秒針・分針・時針 の描画、時刻のデジタル表示
void MainPage::f() {
// 時針
auto line_h = ref new Shapes::Line();
line_h->Stroke
= ref new SolidColorBrush(Windows::UI::Colors::Blue);
line_h->StrokeThickness = 8;
line_h->X1 = xh; line_h->Y1 = yh;
line_h->X2 = xc; line_h->Y2 = yc;
canvas2->Children->Clear();
canvas2->Children->Append(line_h);
// 分針
auto line_m = ref new Shapes::Line();
line_m->Stroke
= ref new SolidColorBrush(Windows::UI::Colors::Green);
line_m->StrokeThickness = 5;
line_m->X1 = xm; line_m->Y1 = ym;
line_m->X2 = xc; line_m->Y2 = yc;
canvas3->Children->Clear();
canvas3->Children->Append(line_m);
// 秒針
auto line_s = ref new Shapes::Line();
line_s->Stroke
= ref new SolidColorBrush(Windows::UI::Colors::Red);
line_s->StrokeThickness = 2;
line_s->X1 = xs; line_s->Y1 = ys;
line_s->X2 = xc; line_s->Y2 = yc;
canvas4->Children->Clear();
canvas4->Children->Append(line_s);
// 時刻のデジタル表示
String^ str_s;
str_s = s.ToString();
if (s < 10)
str_s = "0" + str_s;
String^ str_m;
str_m = m.ToString();
if (m < 10)
str_m = "0" + str_m;
String^ str_h;
str_h = h.ToString();
if (h < 10)
str_h = "0" + str_h;
block->Text = str_h + ":" + str_m + ":" + str_s;
}
// タイマーのスタート
void MainPage::StartTimer() {
auto timer = ref new Windows::UI::Xaml::DispatcherTimer();
TimeSpan span;
span.Duration = 1000000;
timer->Interval = span;
timer->Start();
auto rcpt
= timer->Tick +=
ref new EventHandler<Object^>(this, &MainPage::OnTick);
}
// タイマー ON のときの作業
void MainPage::OnTick(Object^ sender, Object^ e) {
func();
xs = 150 + len_s * cos((90 - 6 * s) * pi / 180);
ys = 150 - len_s * sin((90 - 6 * s) * pi / 180);
xm = 150 + len_m * cos((90 - 6 * m - 0.1f * s) * pi / 180);
ym = 150 - len_m * sin((90 - 6 * m - 0.1f * s) * pi / 180);
xh = 150 + len_h * cos((90 - 30 * h - 0.5f * m) * pi / 180);
yh = 150 - len_h * sin((90 - 30 * h - 0.5f * m) * pi / 180);
f();
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7656717
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック