メニューくらいですと何とか手書きでも可能ですが、さすがにダイアログボックスの リソースを手書きで書くのは大変です。
でも、まあ何事も経験です。
ダイアログボックスのリソース(DIALOGEX)の構文は次のようになっています。
DIALOGEXは昔はDIALOGでしたが、現在ではほとんど使われません。
nameID DIALOGEX x, y, width, height [ , helpID]] [[ optional-statements]] { control-statements }nameIDには、ダイアログボックスの識別子を指定します。
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 ENDLTEXTは、左詰テキストコントロールです。書式は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」ボタンを押すと、左の図のようなメッセージボックスが 出現します。
Update 07/Dec/2003 By Y.Kumei