Mesoscopic Programming

タコさんプログラミング専門

ウィンドウズプログラミング講座第4回:メニューとキーボードアクセラレータ

概要

おはようございます。メニューもアクセラレータもウィンドウズプログラムの基本中の基本ですが、やんないと先に進めないのでサクっと行きます。
あとうちでは原則としてリソースファイルは嫌いなので使いません。何しろリソースファイルは修正がめんどくさいですから。テキストエディタでできるところは全部テキストエディタでやりたいじゃないすか。

実行画面

ソースファイル
  1. main.h
  2. main.cpp
実行ファイル
  1. Windows.zip


メニュー

メニューに使うIDは afxres.h を使うと便利です。自分で名前考えなくて済むし。何しろプログラミングで一番時間食うのは名前の付け方ですから。

作成

もう当たり前のように CreateMenu() 関数を使うだけです。まあ AppendMenu() も使いますけど。
それでもリソースエディタを使うよりだいぶ早いです。なんつったってテキストエディタだったらコピペでガンガン行けちゃいますからね。リーソースエディタなんて使うやつの気が知れね。

#include <afxres.h>

BOOL App :: Init( HINSTANCE hInstance, int nCmdShow )
{
    HMENU hMenu;
    HMENU hFileMenu;
    HMENU hHelpMenu;

    hMenu     = CreateMenu();
    hFileMenu = CreateMenu();
    hHelpMenu = CreateMenu();

    AppendMenu( hFileMenu, MF_STRING, ID_FILE_NEW,            _T( "新規作成(&N)\tCtrl+N" ) );
    AppendMenu( hFileMenu, MF_STRING, ID_FILE_OPEN,           _T( "開く(&O)...\tCtrl+O" ) );
    AppendMenu( hFileMenu, MF_STRING, ID_FILE_SAVE,           _T( "保存(&S)...\tCtrl+S" ) );
    AppendMenu( hFileMenu, MF_SEPARATOR, 0,                   NULL );
    AppendMenu( hFileMenu, MF_STRING, ID_APP_EXIT,            _T( "終了(&X)\tAlt+F4" ) );
    AppendMenu( hHelpMenu, MF_STRING, ID_HELP,                _T( "ヘルプ(&H)...\tF1" ) );
    AppendMenu( hMenu,     MF_POPUP,  ( UINT_PTR ) hFileMenu, _T( "ファイル(&F)" ) );
    AppendMenu( hMenu,     MF_POPUP,  ( UINT_PTR ) hHelpMenu, _T( "ヘルプ(&H)" ) );

    hWnd      = CreateWindow( appClass, appName, dwStyle,
                              CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, hMenu, hInstance, this );
}
解説

メニューの並べ方は、とにかく他のアプリケーションをよく見て右ひじ見て左ひじ見て真似するだけです。考える時間がもったいない。

処理

これもお約束中のお約束です。お約束を忘れちゃコマンドーなんつって。

VOID App :: OnCommand()
{
    UINT id = LOWORD( wparam );

    switch ( id )
    {
    case ID_FILE_NEW :  OnFileNew();  break;
    case ID_FILE_OPEN : OnFileOpen(); break;
    case ID_FILE_SAVE : OnFileSave(); break;
    case ID_APP_EXIT :  OnAppExit();  break;
    case ID_HELP :      OnHelp();     break;
    }
}

VOID App :: OnFileNew()
{
    MessageBox( hwnd, _T( "新規作成" ), appName, MB_ICONINFORMATION );
}

VOID App :: OnFileOpen()
{
    MessageBox( hwnd, _T( "開く" ), appName, MB_ICONINFORMATION );
}

VOID App :: OnFileSave()
{
    MessageBox( hwnd, _T( "保存" ), appName, MB_ICONINFORMATION );
}

VOID App :: OnAppExit()
{
    SendMessage( hwnd, WM_CLOSE, 0, 0 );
}

VOID App :: OnHelp()
{
    MessageBox( hwnd, _T( "ヘルプ" ), appName, MB_ICONINFORMATION );
}
解説

OnAppExit() 以外は借りです。借り暮らしの~。


キーボードアクセラレータ

キーボードアクセラレータあるある早く言いたい~♪

作成
BOOL App :: Init( HINSTANCE hInstance, int nCmdShow )
{
    ACCEL accels[] =
    {
        { FVIRTKEY | FNOINVERT | FCONTROL, 'N',   ID_FILE_NEW },
        { FVIRTKEY | FNOINVERT | FCONTROL, 'O',   ID_FILE_OPEN },
        { FVIRTKEY | FNOINVERT | FCONTROL, 'S',   ID_FILE_SAVE },
        { FVIRTKEY | FNOINVERT,            VK_F1, ID_HELP },
    };

    hAccel = CreateAcceleratorTable( accels, sizeof accels / sizeof ( ACCEL ) );
}
解説

キーボードアクセラレータを使うと~♪

処理
VOID App :: Run()
{
    MSG msg;

    while ( GetMessage( & msg, NULL, 0, 0 ) )
    {
        if ( TranslateAccelerator( hwnd, hAccel, & msg ) == 0 )
        {
            TranslateMessage( & msg );
            DispatchMessage( & msg );
        }
    }

    DestroyAcceleratorTable( hAccel );
}
解説

便利~♪

以上です。