プログラミングメモ →目次


モーダルダイアログでのアクセラレータキー

 モーダルダイアログで、メニューやボタンへのアクセラレータキーを追加するメモです。
0.ダイアログベースのプロジェクトを作成します。
1.IDM_MENU1というIDのメニューを追加します。
2.IDC_BUTTON1というIDのボタンを追加します。
3.Acceleratorという種類のリソースをリソースに追加することで、IDR_ACCELERATOR1として追加してくれます。
4.IDR_ACCELERATOR1にIDM_MENU1追加して、CTRL+1というアクセラレータキーを設定します。
 IDC_BUTTON1追加して、CTRL+2というアクセラレータキーを設定します。



5.ダイアログクラス(CAccDlg)に HACCEL m_hAccelTable; を追加します。初期値をNULLにします。
6.CAccDlg::OnInitDialog()に、 m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
を追加します。
7.BOOL CAccDlg::PreTranslateMessage(MSG* pMsg)を下記のようにオーバーライドします。
if (m_hAccelTable)
{
 if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg))
 { return(TRUE); } }
 return CDialogEx::PreTranslateMessage(pMsg);

以上の実装で、Ctrl+1とCtrl+2を受けてくれます。

ソースコードの抜粋:

class CAccDlg : public CDialogEx
{
// コンストラクション
public:
  CAccDlg(CWnd* pParent = NULL);	// 標準コンストラクター
    HACCEL  m_hAccelTable;
...
};
CAccDlg::CAccDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CAccDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_hAccelTable = NULL;
}

BOOL CAccDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
...
    m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
                     MAKEINTRESOURCE(IDR_ACCELERATOR1));
    return TRUE; 
}
void CAccDlg::OnMenu1()
{
    AfxMessageBox(_T("Menu1"));
}

void CAccDlg::OnBnClickedButton1()
{
    AfxMessageBox(_T("Button1"));
}

BOOL CAccDlg::PreTranslateMessage(MSG* pMsg)
{
    if (m_hAccelTable) 
    {
        if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) 
        {
            return(TRUE);
        }
    }
    return CDialogEx::PreTranslateMessage(pMsg);
}