Last Updated 2002/05/23
Programming Tips Visual C++ MFC ダイアログ  索 引 
アクセラレータテーブルの設定方法
2002/05/23

SDI や MDI ではアクセラレータテーブルは最初から関連付いている.
しかしダイアログベースでは関連付いていない.
ダイアログベースにメニューを追加した場合など,アクセラレータテーブルを関連付ける.


リソースのアクセラレータの ID を IDR_ACCELERATOR1 とする.
BOOL CTestDlg::TranslateAccelerator(MSG* pMsg)
{
    // アクセラレータを一回だけロードする
    static HACCEL hAccel = HACCEL(0);
    if( hAccel == HACCEL(0) ) {
        hAccel = ::LoadAccelerators(::AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
        ASSERT(hAccel != HACCEL(0));
    }
    // API の TranslateAccelerator を呼ぶ
    return ::TranslateAccelerator(GetSafeHwnd(), hAccel, pMsg);
}

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
{
    if( TranslateAccelerator(pMsg) )
        return TRUE;
    return CDialog::PreTranslateMessage(pMsg);
}


または,RegisterHotKey() を利用する.(その場合はアクセラレータを使用しない)

    const int ID_TEST = 100;

    開始時に RegisterHotKey
    BOOL CTestDlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
        ::RegisterHotKey(GetSafeHwnd(), ID_TEST, MOD_CONTROL,
                         UINT('D'));
    }


    終了時に UnregisterHotKey
    void CTestDlg::OnDestroy() 
    {
        ::UnregisterHotKey(GetSafeHwnd(), ID_TEST);
        CDialog::OnDestroy();
    }

メッセージ ハンドラ (for WM_HOTKEY) を追加

    BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
        //{{AFX_MSG_MAP(CTestDlg)
        ON_MESSAGE(WM_HOTKEY, OnHotKey)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    LRESULT CTestDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
    {
        if( int(wParam)          == ID_TEST     &&
            UINT(LOWORD(lParam)) == MOD_CONTROL &&
            UINT(HIWORD(lParam)) == UINT('D')     ) {
            // 目的の処理を行う
        }
        return LRESULT(0);
    }


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

DSS ProgrammingTipsCGI Ver2.02