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" を追加する。

  20: //char*バッファサイズ
  21: #define BUFFER_SIZE     255
  22: 
  23: //西暦年の最小値と最大値
  24: #define YEAR_MIN    1
  25: #define YEAR_MAX    9999
  26: 
  27: //現在のインターフェイス
  28: HINSTANCE hInst;

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

  31: /**
  32:  * テキストボックスから整数を取得
  33:  * @param  HWND     hDlg  ダイアログID
  34:  * @param  unsigned id    テキストボックスID
  35:  * @return int 取得値
  36: */
  37: int getIntEditBox(HWND hDlg, unsigned id) {
  38:     char buff[BUFFER_SIZE + 1];
  39:     GetDlgItemText(hDlg, id, buff, sizeof(buff));
  40: 
  41:     return atoi(buff);
  42: }

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

  44: /**
  45:  * テキストボックスに整数を代入
  46:  * @param  HWND     hDlg  ダイアログID
  47:  * @param  unsigned id    テキストボックスID
  48:  * @param  int      i     設定値
  49:  * @return なし
  50: */
  51: void setIntEditBox(HWND hDlg, unsigned id, int i) {
  52:     char buff[BUFFER_SIZE + 1];
  53:     snprintf(buff, sizeof(buff), "%d", i);
  54:     SetDlgItemText(hDlg, id, buff);
  55: }

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

  31: /**
  32:  * ダイアログボックス
  33:  * @param   HWND hDlg
  34:  * @paramm  UINT uMsg
  35:  * @param   WPARAM wParam
  36:  * @paramL  PARAM lParam
  37:  * @return  INT_PTR CALLBACK
  38: */
  39: INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  40:     char buff[255];
  41: 
  42:     time_t t = time(0);                 //現在時刻
  43:     tm* now = localtime(&t);            //ローカルタイム
  44:     int year = now->tm_year + 1900;     //西暦年を取り出す
  45:     bool res = isleap(year);            //閏年かどうか判定する
  46: 
  47:     switch(uMsg) {
  48:         case WM_INITDIALOG:
  49:             snprintf(buff, sizeof(buff), "%d年は 閏年%s", year, (res ? "です." : "ではありません."));
  50:             SetDlgItemText(hDlg, IDC_LABEL, buff);
  51:             break;
  52:         case WM_CLOSE:
  53:             EndDialog(hDlg, 0);
  54:             break;
  55:     }
  56:     return 0;
  57: }

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

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

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

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

参考サイト

(この項おわり)
header