Last Updated 2002/07/09
Visual C++ MFC ダイアログ
ダイアログアプリにアクセラレータ
2002/07/09

ダイアログベースのアプリケーションにアクセラレータを使う為,以下の様にしても動作しない.

ダイアログにメニュー,ツール,ステータスバーの3つをつけて動作するようにした後に
(1)リソースエディタで Accelerator を作りメニューバーと同じ ID をつける
(2)アクセラレータキー(Ctrl+T)を登録する
(3)メニューバーのアイテムのキャプションを[ツールバー(&T)\tCtrl+T]とする

MDI&SDI ではこれだけで動作するが,ダイアログベースでは動作しない.



API ベースであれば,ダイアログを CreateDialog して,自前のメッセージループを持つ.
その中で,まずアクセラレータかどうかをチェック(TranslateAccelerator())
次にダイアログのアクセラレータをチェック(IsDialogMessage())

MFC の場合は,PreTranslateMessage() でアクセラレータ変換すれば行ける.

リソース ID が IDR_ACCELERATOR_1 の場合,
 HACCEL Acl;
 Acl = LoadAccelerators(
        AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR_1));
とする.
Acl を CDlgTest のメンバにしておいて,CDialog::OnInitDialog() で1度やれば十分です。


BOOL CDlgTest::PreTranslateMessage(MSG* pMsg) 
{
    int x;  
    x = TranslateAccelerator(pMsg->hwnd, Acl, pMsg);
    TRACE("%d\n", x);
    if(IsDialogMessage(pMsg)) {
        TRACE("上\n");
        return TRUE;
    } else {
        TRACE("下\n");
        TranslateMessage();
        return CDialog::PreTranslateMessage(pMsg);
    }

}


参照
アクセラレータテーブルの設定方法
前後のTips
ダイアログアプリにアクセラレータ

DSS ProgrammingTipsCGI Ver1.02