今回は「BCCForm and BCCSkelton」(以下単にBCCFormと略します。このソフトについては
前章を参照してください。)でダイアログボックスのリソースを作ってみます。
使い方は、メニューの時とたいして変わりません。
ちょっと話は変わりますが、BCC Developerで「ツール」「環境設定」で
リソースエディタをBCCFormに設定しておくと簡単に起動することができます。
左の図の「リソーススクリプト」ボタンを押すとBCCFormが起動します。
では、適当なダイアログボックスを作ってみてください。
BCCFormで「編集」「リソースの追加」「ダイアログ」でダイアログボックスを追加します。
リソースID名は「MYDLG」とします。
「完了」ボタンを押します。
そうすると、左の図のようなダイアログボックスのひな形が出てきます。
ダイアログボックスというよりはVBのフォームみたいな感じです。 サイズ変更ができたり、「最小化ボタン」がついていたりして ちょっと普通のダイアログボックスとは違いますね。
そこで、これを右クリックして「コントロールの編集」を選択します。
キャプションを適当なものに変えます。
境界線を「ダイアログ枠」に変更します。
「最大化」「最小化」ボタンのチェックもはずします。
フォントも適当なものに変更しました。
ダイアログボックス自体の大きさも変えて、エディットコントロールと
ボタンを追加しました。
これは、右クリックで「コントロールの追加」で行います。
ボタンのキャプションも「コントロールの編集」で行えます。
エディットコントロールのシンボルはIDC_EDIT01、ボタンはIDOKとしました。
メニューは「ファイル」→「終了」、「オプション」→「ダイアログボックス」という
感じで作ってみてください。
では、本体のプログラムを作ってみましょう。
// form02.cpp
#include <windows.h>
#include "Resform02.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
char szClassName[] = "form02"; //ウィンドウクラス
HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;
hInst = hCurInst;
if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
//ウィンドウ・クラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc; //プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;//インスタンス
wc.hIcon = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = "MYMENU"; //メニュー名
wc.lpszClassName = (LPCSTR)szClassName;
wc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
return (RegisterClassEx(&wc));
}
//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(szClassName,
"猫でもわかるダイアログボックス", //タイトルバーにこの名前が表示されます
WS_OVERLAPPEDWINDOW, //ウィンドウの種類
CW_USEDEFAULT, //X座標
CW_USEDEFAULT, //Y座標
CW_USEDEFAULT, //幅
CW_USEDEFAULT, //高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
int id;
switch (msg) {
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDM_END:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case IDM_DLG:
DialogBox(hInst, "MYDLG", hWnd, (DLGPROC)MyDlgProc);
break;
}
break;
case WM_CLOSE:
id = MessageBox(hWnd,
"終了してもよろしいですか",
"確認",
MB_YESNO | MB_ICONQUESTION);
if (id == IDYES)
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
LRESULT CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDOK:
EndDialog(hDlg, IDOK);
return TRUE;
}
return FALSE;
}
return FALSE;
}
メニューの「オプション」「ダイアログボックス」を選択すると・・・
左の図のようなダイアログボックスが出現すれば成功です。
エディットコントロールに記入し、「終了」ボタンを押してもダイアログボックス が閉じるだけで何も起こりません。
では、リソース・スクリプト(form02.rc)はどのようにに作られているのでしょうか。
//-----------------------------------------
// BCCForm Ver 2.41
// An Easy Resource Editor for BCC
// Copyright (c) February 2002 by ysama
//-----------------------------------------
#include "Resform02.h"
//----------------------------------
// ダイアログ (MYDLG)
//----------------------------------
MYDLG DIALOG DISCARDABLE 0, 0, 156, 87
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION | WS_SYSMENU | DS_SETFONT
CAPTION "フリーソフトで作るダイアログボックス"
FONT 10, "MS 明朝"
{
CONTROL "終了", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 33, 66, 87, 15
CONTROL "", IDC_EDIT01, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | ES_AUTOHSCROLL | ES_LEFT, 6, 3, 144, 54
}
//-------------------------
// メニュー(MYMENU)
//-------------------------
MYMENU MENU DISCARDABLE
{
POPUP "ファイル(&F)"
{
MENUITEM "終了(&X)", IDM_END
}
POPUP "オプション(&O)"
{
MENUITEM "ダイアログボックス(&D)", IDM_DLG
}
}
ヘッダファイル(Resform02.h)は次のようになっていました。
//----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // ダイアログリソース //--------------------- // ダイアログ MYDLG #define IDC_EDIT01 101 //--------------------- // メニューリソース //--------------------- // メニュー MYMENU #define IDM_END 200 #define IDM_DLG 201 //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //-------------------- //------------------ // ヴァージョン情報 //------------------これで、BCCでメニューやダイアログボックスのリソース・スクリプトを含むプログラムを作るのが かなり簡単になりましたね。
Update 29/Dec/2003 By Y.Kumei