|
アナログ時計操作クラス |
| Visual C++ MFC 版ダウンロード | AnalogClockMFC.zip (2006/03/18) |
| 一般 C++ Win32SDK 版ダウンロード |
AnalogClockSDK.zip (2006/03/25) ※ 2006/03/25 基本ウィンドウ汎用化変更版 |
時間を指定する場合、その多くはエディットボックスによる数値入力やスピンボックスであったりします。
良くできているものでもデジタルクロック形式のものでしょう。
そこで漢の浪漫シリーズ第二弾(笑)として皆様にお送りするのはアナログ時計です。
あ、いや、別にシリーズって訳じゃないのですが妙に格好良いじゃありませんか、アナログ的なものって。
さて上記の画像は本クラスの標準スタイルです。
針の形状、大きさ、色などは WinXP のコントロールパネル→日付と時刻で表示されるアナログ時計に似せてあります。
しかしながら、本クラスは、表示のカスタマイズ性をかなり柔軟に指定できるように設計いたしました。
下記の時計表示はいずれも本クラスの表示設定パラメータを変更しただけです。

針の長さ・太さ・色・表示の ON/OFF、ルーラーの大きさ・色・表示の ON/OFF、背景色の指定など、
およそ考えられる全ての項目を設定可能としました。
針の描画がポリゴンなので自由変形が可能になっています。ポリゴン描画とはいっても Win32API と MFC しか使用していません。
針を掴んだかどうかは PtInRegion で実装しました。多角形とポイントの当たり判定はこれが最もお手軽です。
設定項目が多いとプログラムが大変ですよね。
そこで、本クラスの設定情報をプログラムリストとして出力する機能をサンプルに付けました。
見て分かるとおり、本クラスで設定可能なパラメータの全てが編集可能となっています。
元々は、機能テストのために作ったのですが、設定項目が増えて使いにくいと感じたので急遽プログラム出力機能を付けたものです。
このツールのおかげで、単にアナログ時計を表示させるだけなら、MFC の新規プロジェクト作成から始まって 10分もあれば時計を完成させることが出来ました。
ダウンロードアーカイブにサンプルとして入っている PopupAnalogClock というプロジェクトがそれです。
※ 高速に作るのが目的でしたので、こちらのサンプルはまともにコメントは入っていません。
このツールが上記のスタイルを再現するために出力したプログラムリストは下記の通りです。
コメントも自動で出力されています。
|
// 下記変数宣言はメンバ変数としてヘッダファイルに記載する CAnalogClock* m_pClock; // アナログ時計をインスタンスする m_pClock = new CAnalogClock(this); // 時針スタイルの設定 m_pClock->EnableHour(TRUE); m_pClock->SetLengthScaleHour(2.00f); m_pClock->SetGirthScaleHour(2.46f); m_pClock->SetColorHour(RGB(255,0,0)); // 分針スタイルの設定 m_pClock->EnableMinute(TRUE); m_pClock->SetLengthScaleMinute(2.00f); m_pClock->SetGirthScaleMinute(3.44f); m_pClock->SetColorMinute(RGB(0,128,255)); // 秒針スタイルの設定 m_pClock->EnableSecond(TRUE); m_pClock->SetLengthScaleSecond(1.44f); m_pClock->SetColorSecond(RGB(0,0,160)); // 盤面スタイルの設定 m_pClock->EnableBigRuler(TRUE, 10); m_pClock->EnableSmallRuler(TRUE, 5); m_pClock->EnableShadow(TRUE); m_pClock->SetColorBoard(RGB(236,233,216)); m_pClock->SetColorBigRuler(RGB(255,128,64)); m_pClock->SetColorSmallRuler(RGB(0,128,64)); m_pClock->SetScale(0.50f); m_pClock->SetWindowPos(NULL, 0, 0, 418, 418, SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW); // 操作モードの設定 m_pClock->SetDirectMode(CAnalogClock::ETargetHand(3)); m_pClock->EnableAutoUpdate(TRUE); |
| リファレンス |