C++ でイベント駆動型アプリを作る

(1/1)
C++でイベント駆動型アプリを作る
C++でダイアログボックスを使う」では、今年がうるう年かどうかを判定するだけだったが、今回は任意の西暦年を入力し、うるう年かどうかの判定結果をWindowsのダイアログに表示することを目標にする。

サンプル・プログラム

リソースの準備

Eclipse を起動し、新規プロジェクト isleap3 を用意する。
C++でイベント駆動型アプリを作る
C++でイベント駆動型アプリを作る
ResEdit を起動し、resource.rc を用意する。
前回との違いは、西暦年を入力するための Edit Control と、年数を1ずつ増減できる Spin Control を加えた部分である。

また、アプリケーションのアイコン "application.ico" を「メニュー→リソースの追加→アイコン」を使って追加した。icoファイルは、Photoshop等であらかじめ作成しておく。

プログラムの解説

Eclipse に戻り、ソース・プログラム "isleap3.cpp" を追加する。

0020: //char*バッファサイズ
0021: #define BUFFER_SIZE     255
0022: 
0023: //西暦年の最小値と最大値
0024: #define YEAR_MIN 1
0025: #define YEAR_MAX 9999
0026: 
0027: //現在のインターフェイス
0028: HINSTANCE hInst;

文字列を操作するために、char*バッファのサイズを BUFFER_SIZE に定義する。
ユーザー入力の範囲として、西暦年の最小値と最大値を定義する。

0031: /**
0032:  * テキストボックスから整数を取得
0033:  * @param  HWND       hDlg  ダイアログID
0034:  * @param  unsigned   id    テキストボックスID
0035:  * @return int取得値
0036: */
0037: int getIntEditBox(HWND hDlgunsigned id) {
0038:     char buff[BUFFER_SIZE + 1];
0039:     GetDlgItemText(hDlgidbuffsizeof(buff));
0040: 
0041:     return atoi(buff);
0042: }

テキストボックスに入っているテキストを整数として返すユーザー関数 getIntEditBox を用意した。

0044: /**
0045:  * テキストボックスに整数を代入
0046:  * @param  HWND       hDlg  ダイアログID
0047:  * @param  unsigned   id    テキストボックスID
0048:  * @param  int       i     設定値
0049:  * @returnなし
0050: */
0051: void setIntEditBox(HWND hDlgunsigned idint i) {
0052:     char buff[BUFFER_SIZE + 1];
0053:     snprintf(buffsizeof(buff), "%d", i);
0054:     SetDlgItemText(hDlgidbuff);
0055: }

逆に、整数をテキストボックスにテキストとして代入するユーザー関数が setIntEditBox である。

0031: /**
0032:  * ダイアログボックス
0033:  * @param HWND hDlg
0034:  * @paramm UINT uMsg
0035:  * @param WPARAM wParam
0036:  * @paramL PARAM lParam
0037:  * @return INT_PTR CALLBACK
0038: */
0039: INT_PTR CALLBACK DlgProc(HWND hDlgUINT uMsgWPARAM wParamLPARAM lParam) {
0040:     char buff[255];
0041: 
0042:     time_t t = time(0);                  //現在時刻
0043:     tmnow = localtime(&t);         //ローカルタイム
0044:     int year = now->tm_year + 1900;        //西暦年を取り出す
0045:     bool res = isleap(year);         //閏年かどうか判定する
0046: 
0047:     switch(uMsg) {
0048:         case WM_INITDIALOG:
0049:             snprintf(buffsizeof(buff), "%d年は 閏年%s", year, (res ? "です." : "ではありません."));
0050:             SetDlgItemText(hDlgIDC_LABELbuff);
0051:             break;
0052:         case WM_CLOSE:
0053:             EndDialog(hDlg, 0);
0054:             break;
0055:     }
0056:     return 0;
0057: }

ダイアログボックス関数にイベントが増えた。
Spin Control がクリックされると、WM_NOTIFY イベントが発生する。増加か減少かを判断し、西暦年の増減を行い、うるう年判定結果をテキストボックスに代入する。

プロジェクトのビルドと実行

ビルドは前回と同じである。
Debugフォルダに出力される isleap3.exe は約1.3Mバイトである。

正式配賦するexeファイルをビルドするときは、「メニュー→プロジェクト→ビルド構成→アクティブにする→Release」を選ぶ。すると、約100Kバイトのコンパクトなexeファイルがビルドされる。

参考サイト

(この項おわり)
header