C++ でダイアログボックスを使う

(1/1)
C++でダイアログボックスを使う
今回は、「C++でコマンドラインアプリを作る」の出力を、左図のようにWindowsのダイアログに表示することを目標にする。

サンプル・プログラム

リソースの準備

Eclipse を起動し、前回同様、新規プロジェクト isleap2 を用意する。
C++でダイアログボックスを使う
次に、Windowsダイアログのリソースを作成するために、ResEdit を使う。
ResEdit を起動したら、「メニュー→ファイル→新規プロジェクト」を選択し、Locationにプロジェクト isleap2 のフォルダを、Nameに resource を入力し、Finishする。
C++でダイアログボックスを使う
すると、リソース作成画面になる。「メニュー→リソースの追加→ダイアログ」を選ぶと、中央ペインにダイアログが作成される。ボタンは不要なので削除する。
右ペインのツールボックスから Static Text をドラッグしてきて、ダイアログ上に配置する。ここに閏年の判定結果を表示する。
左下のプロパティで、IDを IDC_LABEL と入力する。C++プログラムの方から、このIDを参照することになる。
入力ができたら、保存する。

プログラムの解説

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

   7: // 初期値 ============================================================
   8: #include <windows.h>
   9: #include <commctrl.h>
  10: #include <stdio.h>
  11: #include <string>
  12: #include <stdlib.h>
  13: #include <time.h>
  14: #include "resource.h"
  15: using namespace std;

ダイアログによるアプリを作る際は、これらのヘッダをincludeしておく。
"windows.h" はWindowsアプリを作るために必要なヘッダdata。
"resource.h" は、ResEdit で作ったリソースIDなどが入っている。

  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: }

ダイアログに関するイベントを司るのが関数 DlgProc である。
イベントが発生すると、uMsg にイベントの種類が渡される。
WM_INITDIALOG はダイアログの初期化、WM_CLOSE は終了アイコンが押下されたときに発生するイベントである。今回は、この2つしか使用しない。

  60: /**
  61:  * Windowsメインプログラム
  62:  * @param   HINSTANCE hInstance
  63:  * @paramm  HINSTANCE hPrevInstance
  64:  * @param   LPSTR lpCmdLine
  65:  * @paramL  int nShowCmd
  66:  * @return  int リターンコード
  67: */
  68: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
  69:     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DlgProc)DlgProc);
  70:     return 0;
  71: }

Windowsアプリケーションのメインプログラムは関数 WinMain である。

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

C++でダイアログボックスを使う
ダイアログアプリをビルドするには、minGW C++ Linker の設定を変えてやる必要がある。
リンカーー・フラグに "-mwindows -static -lstdc++ -lgcc -lwinpthread" を、その他のオブジェクトとしてリソースから生成されるオブジェクト "resource.o" を追加してやる。
C++でダイアログボックスを使う
さらに、「ビルド・ステップ→ビルド前のステップ」に "windres ../resource.rc ../resource.o" を設定する。
C++でダイアログボックスを使う
ビルドを実行すると、左図のようなダイアログが表示されるだろう。

参考サイト

(この項おわり)
header