ショートカットメニューを設定する


日本

オランダ

クウェート

VC++ でショートカットメニューを設定して、一発で国旗を表示します。

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

プロジェクトの設定

  1. メニュー選択で国旗を切り替える プロジェクトを開いて下さい。
    下の画像はメニューを作成したときのものですが、[Alt] [S] [K] の順にキーをゆっくりタイプしてみて下さい。
    メニューに割り当てられたキーの操作により、クエートの国旗が表示されるはずです。
    説明の画像
  2. 今回設定する機能はメニューに割り当てられたキーとは違い「一発のキー操作」で国旗を表示するショートカットメニューです。
    本来ショートカットメニューの操作にはプログラムの修正が必要なのですが、テンプレートを使って作成したプログラムには 最初からショートカットメニューのソースが組み込まれているので、リソースを作成するだけで使えるようになります。
    _tWinMain() 関数は次のようになります。
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
        // TODO: ここにコードを挿入してください。
        MSG msg;
        HACCEL hAccelTable;
    
        // グローバル文字列を初期化しています。
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadString(hInstance, IDC_MAIN, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);
    
        // アプリケーションの初期化を実行します。:
        if (!InitInstance (hInstance, nCmdShow)) 
        {
            return FALSE;
        }
    
        hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MAIN);
    
        // メイン メッセージ ループ :
        while (GetMessage(&msg, NULL, 0, 0)) 
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    
        return (int) msg.wParam;
    }
    
  3. [リソースタブ] から [Accelerator][IDC_MAIN] を選ぶと現在登録されているキーが表示されます。
    説明の画像
  4. IDM_ABOUT の次の行をクリック(ダブル)して、下の画像を参考に IDC_FALG0 ~ IDC_FALG2 のキーを設定して下さい。
    説明の画像
  5. これだけでショートカットメニューが使えるようになります。
  6. [デバッグ][デバッグなしで開始]を選択して、ビルドに続いて実行を行います。
    最初は日本の国旗が表示されます。
    [Ctrl] + [B] キーを押すとオランダの国旗が表示されます。
    同様に [Ctrl] + [C] でクエートの国旗が、 [Ctrl] + [A] で日本の国旗が表示されます。

【メモ】

リソースにショートカットメニューが登録されていないときは [挿入][リソース][Accelerator][新規作成] から登録します。
先頭の行をダブルクリックすると、キーを設定する DialogBox が表示されます。
規定値のIDで登録すると IDR_ACCELERATOR1 が使われるので、以下のソースコード(//★の行)を追加して下さい。
HACCEL      hAccel;
            :
    hAccel= LoadAccelerators(hInst,(LPCTSTR)IDR_ACCELERATOR1);      //★
    if (hAccel==NULL)   MessageBox(NULL, "失敗です", "", MB_OK);    //★

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

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