時計

時計を作る("MyTokei")

//
//	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);	// 時刻の取得

実際には、いろいろなものを得ることができます。

時刻から、針の位置を決めます。

その他は、タイマー、メモリデバイスなどを使っています。


[前] [目次]