//
// MyApp.h
//
class MyApp : public MyMainWnd{
public:
// WM_CLOSE
void wmClose(){
KillTimer(hWnd, 1); // タイマー削除
}
// WM_CREATE
void wmCreate(){
SetTimer(hWnd, 1, 10, NULL); // タイマー設定
}
// WM_PAINT
void wmPaint(HDC hdc){
// メモリデバイス
MyMemoryDC mdc(hdc, 450, 450);
MyDC g(mdc.hdc);
// 座標変換
g.Trans(20, 0, 0, -20, mdc.width / 2, mdc.height / 2); // 座標変換
// 時計の背景
g.Pen.Color(255, 215, 0); // gold色
g.Pen.Size(2);
// 外枠
g.Circle(0, 0, 10);
// 目盛
for(int i = 0; i < 360; i += 6){
if(i % 30 == 0){
g.Pen.Color(255, 0, 255); // magentaのペン
g.Pen.Size(3);
}else{
g.Pen.Color(135, 206, 235); // skyblue色のペン
g.Pen.Size(2);
}
g.Circle(8 * cos(DegreeToRadian(i)), 8 * sin(DegreeToRadian(i)), 0.1);
}
// 時刻を得るための変数
SYSTEMTIME st;
double t;
GetLocalTime(&st); // 時刻の取得
g.Pen.Color(0, 0, 0); // 黒色のペン
g.Pen.Size(3);
// 長針
t = st.wMinute * 6 + st.wSecond / 10;
g.MoveTo(0, 0);
g.LineTo(9 * cos(DegreeToRadian(90 - t)), 9 * sin(DegreeToRadian(90 - t)));
// 短針
t = (st.wHour % 12) * 30 + st.wMinute / 2;
g.MoveTo(0, 0);
g.LineTo(5 * cos(DegreeToRadian(90 - t)), 5 * sin(DegreeToRadian(90 - t)));
// 秒針
g.Pen.Color(211, 211, 211); // lightgray色のペン
g.Pen.Size(2);
t = st.wSecond * 6;
g.MoveTo(0, 0);
g.LineTo(6 * cos(DegreeToRadian(90 - t)), 6 * sin(DegreeToRadian(90 - t)));
//=================================================================
// スクリーン画面へコピー
mdc.BitBlt(0,0);
}
};
実行画面です。
時刻を得るには、GetLocalTime関数を使います。
VOID GetLocalTime( LPSYSTEMTIME lpSystemTime // システム日時 );
引数に使うものは、SYSTEMTIME構造体です。
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME
次のようにすれば、現在の時刻を得ることができます。
SYSTEMTIME st; GetLocalTime(&st); // 時刻の取得
実際には、いろいろなものを得ることができます。
時刻から、針の位置を決めます。
その他は、タイマー、メモリデバイスなどを使っています。