モーダルダイアログでのアクセラレータキーモーダルダイアログで、メニューやボタンへのアクセラレータキーを追加するメモです。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); } |