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);
}
参照
ダイアログアプリにアクセラレータ