第8章 ダイアログボックスを作る


この章では、ダイアログボックスのリソースの書き方を復習します。

メニューくらいですと何とか手書きでも可能ですが、さすがにダイアログボックスの リソースを手書きで書くのは大変です。

でも、まあ何事も経験です。



ダイアログボックスのリソース(DIALOGEX)の構文は次のようになっています。 DIALOGEXは昔はDIALOGでしたが、現在ではほとんど使われません。

nameID DIALOGEX x, y, width, height 
[ , helpID]]
 [[ optional-statements]] 
{
       control-statements  
}
nameIDには、ダイアログボックスの識別子を指定します。
ユニークな名前か、符号無し16ビット整数(1-65535)で指定します。

x, yはダイアログボックスの左上隅の相対位置を示します。 このダイアログボックスを呼び出したウィンドウの左上隅が基準点となります。 ただし、単位はダイアログユニットです。

ダイアログユニットは、水平方向は使用するフォントの幅の4分の1、高さは8分の1を1単位 としています。従ってフォントを変えるとダイアログボックスの大きさも変化します。

width, heightは、ダイアログボックスの幅、高さを指定します。単位はダイアログユニットです。

helpIDには、ヘルプのIDを指定します。(省略可能)

optional-statementsには、次のようなものを指定できます。

Statement説明
CAPTION "text"ダイアログボックスのキャプションを指定します
CHARACTERISTICS dwordリソース定義ファイルを読み書きするツールで使用されるリソースに関する情報
(Windowsにとっては意味はありません)
CLASS class専用のウィンドウクラスを持つ場合指定
EXSTYLE extended-styles拡張スタイル
CreateWindowEx関数で使われる第1引数 を参照してください
FONT pointsize, typeface,
weight, italic, charset
フォントの指定
pointsizeはフォントのポイントを指定します。
typefaceはフォントの書体名を指定します。ダブルクォーテーションで囲みます。
weightは、フォントの重さを指定します。0(FW_DONTCARE)または、100-900の間で100刻みで指定
italicはイタリック体かどうかを指定します。(TRUEでイタリック体)
charsetはキャラクターセットを指定します。(ANSI_CHARSET(0x00),SHIFTJIS_CHARSET(0x80)など)
LANGUAGE language,sublanguage言語を指定します
MENU menunameメニュー名を指定(ダイアログボックスがメニューを持つことはほとんどありませんが・・・)
STYLE stylesスタイルを指定(WS_DLGFRAME | WS_VISIBLE | WS_POPUPが基本)
VERSION dwordバージョン情報(ツールで使用されるリソースのバージョン情報, Windowsでは意味無し)

brc32では、DIALOGEXのすべてがサポートされているわけではないようです。 FONTに関してはDIALOGと同じく、ポイントと書体名のみが有効で、それ以上のオプションを付けるとエラーになるようです。

control-statementsには、ダイアログボックス上のコントロール類を記述します。

代表的なものは、エディットコントロールとボタンですね。

エディットコントロールの書式は

EDITTEXT id, x, y, width, height [[, style [[, extended-style]]]]
となります。 idはエディットコントロールのIDを指定します。

x, y, width, heightは、エディットコントロール内の位置、幅、高さで、いずれもダイアログユニットです。

styleに何も指定しないと、ES_LEFT | WS_BORDER | WS_TABSTOPとみなされます。

プッシュボタンは

PUSHBUTTON text, id, x, y, width, height [[, style [[, extended-style]]]]
のように指定します。

textに、ボタンに表示される文字列を指定します。

idはボタンのIDを指定します。

x, y, width, heightには、位置、幅・高さを指定します(ダイアログユニット)。

styleに何も指定しないと、BS_PUSHBUTTON | WS_TABSTOPとみなされます。

デフォルトのプッシュボタンを定義する時はDEFPUSHBUTTONを使います。デフォルトの プッシュボタンとはエンターキーを押した時に選択されるボタンのことです。これは、 ひとつのダイアログボックスに複数指定することはできません。書式はPUSHBUTTONと同じです。

では、BCCでダイアログボックスを含むプログラムを作ってみましょう。

まずは、リソース・スクリプトです。

// dialog01.rc

#include <windows.h>
#include "dialog01.h"

MYDLG DIALOGEX 0, 0, 186, 70
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "登録"
FONT 10, "MS ゴシック"
BEGIN
    LTEXT           "住所",IDC_STATIC,18,12,17,8
    LTEXT           "氏名",IDC_STATIC,17,30,17,8
    EDITTEXT        IDC_EDIT1,52,7,127,15,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,52,28,127,15,ES_AUTOHSCROLL
    DEFPUSHBUTTON   "OK",IDOK,7,49,50,14
    PUSHBUTTON      "終了",IDCANCEL,129,49,50,14
END
LTEXTは、左詰テキストコントロールです。書式はPUSHBUTTONと同じです。

EDITTEXTのES_AUTOHSCROLLはユーザーが行末まで入力したら自動的に右スクロールするスタイルです。

次に、ヘッダファイルを作ります。defineしなくてはいけないのは、IDC_EDIT1, IDC_EDIT2の 2つのリソースシンボルですね。

// dialog01.h

#define IDC_EDIT1                       1001
#define IDC_EDIT2                       1002
予測としては次のようなダイアログボックスですね。



では、呼び出し側の本体のプログラムを作ってみましょう。

プログラムを簡単にするため、WinMain関数でいきなりダイアログボックスを呼び出します。

「OK」ボタンを押すと、エディットコントロールに記入されている、住所と氏名を メッセージボックスで表示するようにします。

「バツ印」ボタンか、「終了」ボタンを押すとプログラム終了です。

// dialog01.cpp

#include <windows.h>
#include "dialog01.h"

BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
                   LPSTR lpsCmdLine, int nCmdShow)
{
    DialogBox(hCurInst, "MYDLG", NULL, (DLGPROC)MyDlgProc);
    return 0;
}

BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
    char szBuf[128], szBuf1[64], szBuf2[64];

    switch (msg) {
        case WM_COMMAND:
            switch (LOWORD(wp)) {
                case IDCANCEL:
                    EndDialog(hDlg, IDCANCEL);
                    return TRUE;
                case IDOK:
                    GetDlgItemText(hDlg, IDC_EDIT1, szBuf1, (int)sizeof(szBuf1));
                    GetDlgItemText(hDlg, IDC_EDIT2, szBuf2, (int)sizeof(szBuf2));
                    wsprintf(szBuf, "あなたの住所は%sで、氏名は%sです", szBuf1, szBuf2);
                    MessageBox(hDlg, szBuf, "猫でもわかるダイアログボックス", MB_OK);
                    return TRUE;
            }
            return FALSE;
    }
    return FALSE;
}
「OK」ボタンが押されたら、GetDlgItemText関数で、エディットコントロールに記入されている 文字列を読み取ります。

そして、読み取った文字列をwsprintf関数で加工して、メッセージボックスで表示します。

住所、氏名欄に記入してから「OK」ボタンを押すと、左の図のようなメッセージボックスが 出現します。




[Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 07/Dec/2003 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。