バージョン情報の DialogBox を表示する

VC++ でバージョン情報のメニューを設定して、DialogBox を表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. 空の新規プロジェクト(Empty2)を作成して Empty2.cpp をプロジェクトに追加します。
    詳細は 空のプロジェクトからプログラムを作成する を参照して下さい。
  2. プログラム終了のメニューを設定します。
    [プロジェクト][リソースの追加][Menu][新規作成] で、親のメニュー「ファイル(F)」を作成して、 その中に「アプリケーションの終了(X)」を追加します。
    親のメニュー「ヘルプ(&H)」を作成して、その中に「バージョン情報 ...(&A)」を追加します。


    メニューの ID を次のように設定して下さい。
    メニュー IDR_MENU1(規定値)
    アプリケーションの終了 IDM_EXIT
    バージョン情報 ...(&A) IDM_ABOUT
  3. バージョン情報を表示する DialogBox を作成します。
    DialogBox の作成方法は Dialog Box のプログラム を参照して下さい。
    DialogBox の「キャプションとID」を次のように設定して下さい。
    BOX キャプション ID
    DialogBox バージョン情報 IDD_ABOUTBOX
    StaticText Sample Program Version 1.0
    Button OK IDOK
  4. 「バージョン情報」のメニューが選択されたときの処理です。
    DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); で Dialog Box 表示します。
    (DLGPROC)About は DialogBox の CALLBACK 関数です。
        // 選択されたメニューの解析 :
        switch(LOWORD(wParam))
        {   case IDM_ABOUT:
                DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                break;
        
  5. ビルドに続いて実行を行います。
    メニューから「バージョン情報 」を選択して、ページ先頭の Window が表示されたら完成です。<(`^´)>

プログラムの説明

  1. DialogBox の CALLBACK 関数の Prototype 宣言をします。
        LRESULT  CALLBACK   About(HWND, UINT, WPARAM, LPARAM);
        
  2. DialogBox を表示するときにインスタンスが必要になります。
    Global Area に g_hInst を定義して保存します。
        HINSTANCE   g_hInst;
              :
              :
        int PASCAL  WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                            LPSTR lpCmdLine,int nCmdShow)
        {   MSG         msg;
    
            g_hInst= hInstance;
        
  3. 「バージョン情報」のメニューが選択されたときの処理です。
    DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); で Dialog Box 表示します。
    About は DialogBox の CALLBACK 関数です。
        // 選択されたメニューの解析 :
        switch(LOWORD(wParam))
        {   case IDM_ABOUT:
                DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                break;
        
  4. DialogBox の CALLBACK 関数を記述します。
    EndDialog() が実行されると DialogBox の Window が閉じられます。
        LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        {
            switch (message)
            {   case WM_INITDIALOG:
                    return TRUE;
                case WM_COMMAND:
                    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
                    {   EndDialog(hDlg, LOWORD(wParam));
                        return TRUE;
                    }
                    break;
            }
            return FALSE;
        }
        

全ソースコード

超初心者の方のために DialogBox でバージョンを表示する全ソースコードを掲載します。 (^_^;)

/******************************************************/
/*★ DialogBox でバージョンを表示する       前田 稔 ★*/
/******************************************************/
#define     NAME    "Empty2 Program"
#include    <windows.h>
#include    "resource.h"

HINSTANCE   g_hInst;

//プロトタイプ宣言
LRESULT  CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);
int      PASCAL     WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
LRESULT  CALLBACK   About(HWND, UINT, WPARAM, LPARAM);

//★ イベントで起動するウインドウプロシージャ
LRESULT  CALLBACK  WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{   PAINTSTRUCT ps;
    HDC         hdc;
    //渡された message から、イベントの種類を解析する
    switch(msg)
    {
        case WM_COMMAND:
        {
            // 選択されたメニューの解析 :
            switch(LOWORD(wParam))
            {   case IDM_ABOUT:
                    DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                    break;
                case IDM_EXIT:
                    DestroyWindow(hWnd);
                    break;
                default:
                    return DefWindowProc(hWnd, msg, wParam, lParam);
            }
            break;
        }
        case WM_PAINT:
             hdc= BeginPaint (hWnd, &ps);
             TextOut(hdc, 40, 60, "空のプロジェクトから作成しました", 32);
             TextOut(hdc, 40, 90, "メニューを設定しました(IDM_EXIT)", 42);
             TextOut(hdc, 40, 120, "アイコンを設定しました(IDI_ICON1)", 44);
             TextOut(hdc, 40, 150, "Version 表示のメニューを設定しました(IDM_ABOUT)", 58);
             EndPaint(hWnd, &ps);
             break;
        case WM_DESTROY:
             PostQuitMessage(0);
             return 0L;
    }
    //デフォルトの処理
    return  DefWindowProc(hWnd,msg,wParam,lParam);
}

//★ Windows Main 関数
int PASCAL  WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,int nCmdShow)
{   HWND        hWnd;
    MSG         msg;

    g_hInst= hInstance;
    // Set up and register window class
    WNDCLASS wc = { CS_CLASSDC,WndProc,0L,0L,hInstance,
                    LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)),
                    LoadCursor(NULL,IDC_ARROW),
                    (HBRUSH)GetStockObject(WHITE_BRUSH),
                    MAKEINTRESOURCE(IDR_MENU1),NAME };

    if (RegisterClass(&wc)==0)    return FALSE;
    // Create a window
    hWnd= CreateWindow(NAME,NAME,WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,CW_USEDEFAULT,560,300,
            NULL,NULL,hInstance,NULL);
    if (!hWnd)  return FALSE;

    ShowWindow(hWnd,nCmdShow);      //Window を表示
    UpdateWindow(hWnd);             //表示を初期化
    SetFocus(hWnd);                 //フォーカスを設定
    while (GetMessage(&msg,NULL,0,0))
    {   TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

//★ バージョン情報ボックスのメッセージ ハンドラです。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {   case WM_INITDIALOG:
            return TRUE;
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
            {   EndDialog(hDlg, LOWORD(wParam));
                return TRUE;
            }
            break;
    }
    return FALSE;
}

超初心者のプログラム入門(Win32API C++)