終了メニューとアイコンを設定する

VC++ で空のプロジェクトを作成して、終了メニューと自分専用のアイコンを設定します。

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

プロジェクトの作成

  1. 空の新規プロジェクト(Empty)を作成します。
  2. Empty1.cpp をフォルダーに格納して[プロジェクト][既存項目の追加]からプロジェクトに追加します。
    ソースコードは「プログラムの説明」を参考にして作成して下さい。
  3. プログラム終了のメニューを設定します。
    [プロジェクト][リソースの追加][Menu][新規作成] で、親のメニュー「ファイル(F)」を作成して、 その中に「アプリケーションの終了(X)」を追加します。
    メニュー設定の詳細は メニュー選択で国旗を切り替える を参照して下さい。


    メニューの ID を次のように設定して下さい。
    メニュー IDR_MENU1(規定値)
    アプリケーションの終了 IDM_EXIT
  4. リソースボックス(Script1)を閉じると保存確認の問い合わせがあるので Empty.rc の名前で保存します。
    【注意】バージョンによっては保存するフォルダーが以前に作業をしていたプロジェクトを指していることがあります。
    現在作業中のプロジェクトであることを確認して下さい。
    問い合わせが無いときは、そのまま作業を進めて下さい。
    強制的にプロジェクトを保存するときはプロジェクトからプロジェクトの保存を選択して下さい。
  5. プロジェクト/プロジェクトへ追加/ファイルで Empty.rc を選択してプロジェクトに追加します。
  6. 自分専用のアイコンを作成して My.ico のファイル名で、プロジェクトのフォルダーに格納して下さい。
    My.ico を[プロジェクト][リソースの追加][アイコン][インポート] で取り込みます。
    アイコンリソースの ID は IDI_ICON1(規定値)にして下さい。
    詳細は 自分専用のアイコンを使用する を参照して下さい。
  7. リソースを登録すると resource.h が作成されるので #include して下さい。
        #include    "resource.h"
        
  8. ビルドに続いて実行を行います。
    ページ先頭の Window が表示されたら完成です。 <(`^´)>
    ウインドウの左上隅に自前のアイコンが表示されていることを確認して下さい。

プログラムの説明

  1. ウインドウに「終了メニュー」と「アイコン」を設定するソースコードです。
        //★ Windows Initialize
        ATOM InitApp(HINSTANCE hInst)
        {
            WNDCLASSEX wc;
            wc.cbSize       = sizeof(WNDCLASSEX);
            wc.style        = CS_CLASSDC;
            wc.lpfnWndProc  = WndProc;      //プロシージャ名
            wc.cbClsExtra   = 0;
            wc.cbWndExtra   = 0;
            wc.hInstance    = hInst;        //インスタンス
            wc.hIcon        = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
            wc.hCursor      = LoadCursor(NULL, IDC_ARROW);
            wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
            wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
            wc.lpszClassName= NAME;
            wc.hIconSm      = NULL;
            return (RegisterClassEx(&wc));
        }
        
  2. WNDCLASS は構造体なので、定義されている順番に初期値として設定することもできます。
    この方がステップ数も少なくてプログラムがすっきりするでしょう。
        WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0L,0L,hInst,
                          LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1)),NULL,
                          (HBRUSH)GetStockObject(WHITE_BRUSH),
                          MAKEINTRESOURCE(IDR_MENU1),NAME,NULL
                        };
        
  3. WM_PAINT: でウインドウにメッセージを表示します。
            case WM_PAINT:
                 hdc= BeginPaint (hWnd, &ps);
                 TextOut(hdc, 40, 80, "空のプロジェクトから作成しました", 32);
                 TextOut(hdc, 40, 110, "メニューを設定しました(IDM_EXIT)", 42);
                 TextOut(hdc, 40, 140, "アイコンを設定しました(IDI_ICON1)", 44);
                 EndPaint(hWnd, &ps);
                 break;
        
  4. 終了メニューが選択されたときプログラムを終了します。
            case WM_COMMAND:
            {
                // 選択されたメニューの解析 :
                switch(LOWORD(wParam))
                {   case IDM_EXIT:
                        DestroyWindow(hWnd);
                        break;
                    default:
                        return DefWindowProc(hWnd, msg, wParam, lParam);
                }
                break;
            }
        
  5. Windows 10 で Empty Menu 空のプロジェクトにメニューを設定します。

【注意】

スモールアイコン(wc.hIconSm)を定義しているときは、こちらも修正が必要です。
//★ Windows Initialize
ATOM InitApp(HINSTANCE hInst)
{
        :
    wc.hIcon        = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
    wc.hIconSm      = NULL;
        :

または
//★ Windows Initialize
ATOM InitApp(HINSTANCE hInst)
{
        :
    wc.hIcon        = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
    wc.hIconSm      = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
        :

【演習】

  1. 次の関数を一つにまとめて、プログラムを整理して下さい。
  2. プログラムを終了する前に MessageBox で「終了確認」を行って下さい。
  3. HINSTANCE と HWND はプログラムのあちこちから参照されることがあります。
    事前にグローバル領域に保存しておいて下さい。
    g_hInst は WM_CREATE: から参照されることがあるので WinMain() の先頭で格納して下さい。
    g_hWnd はウインドウが生成できてから格納しなけれななりません。
        HINSTANCE   g_hInst;
        HWND        g_hWnd;
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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