// // 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); // 時刻の取得
実際には、いろいろなものを得ることができます。
時刻から、針の位置を決めます。
その他は、タイマー、メモリデバイスなどを使っています。