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

0007: // 初期値 ============================================================
0008: #include <windows.h>
0009: #include <commctrl.h>
0010: #include <stdio.h>
0011: #include <string>
0012: #include <stdlib.h>
0013: #include <time.h>
0014: #include "resource.h"
0015: using namespace std;

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

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

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

0060: /**
0061:  * Windowsメインプログラム
0062:  * @param HINSTANCE hInstance
0063:  * @paramm HINSTANCE hPrevInstance
0064:  * @param LPSTR lpCmdLine
0065:  * @paramL int nShowCmd
0066:  * @return int リターンコード
0067: */
0068: int WINAPI WinMain(HINSTANCE hInstanceHINSTANCE hPrevInstanceLPSTR lpCmdLineint nShowCmd) {
0069:     DialogBox(hInstanceMAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
0070:     return 0;
0071: }

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

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

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

参考サイト

(この項おわり)
header