第10章 ダイアログボックスをフリーのエディタで作る


今回は「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でメニューやダイアログボックスのリソース・スクリプトを含むプログラムを作るのが かなり簡単になりましたね。
[Index] [総合Index] [Previous Chapter] [Next Chapter]

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