MFC:为什么加速器不起作用

MFC: Why is the Accelerator not working?

本文关键字:不起作用 加速器 为什么 MFC      更新时间:2023-10-16

我试图在继承CFrameWnd的类中使用一个加速器,该类本身在从CWinApp继承的类中使用。由于某种原因,我在加速器中定义的快捷方式只是不想工作。

有两个类: CMyFrame( CFrameWnd继承(和 CMyApp(从 CWinApp继承(。

相关功能:

BOOL CMyApp::InitInstance() {
    m_hAccel = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
    CMyFrame *Frame = new CMyFrame();
    m_pMainWnd = Frame;
    Frame->ShowWindow(SW_NORMAL);
    Frame->UpdateWindow();
    return TRUE;
}
BOOL CMyApp::ProcessMessageFilter(int code, LPMSG Msg) {
    if (m_hAccel) {
        if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_hAccel, Msg)) {
            return TRUE;
        }
    }
    return CWinApp::ProcessMessageFilter(code, Msg);
}
BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd)
    ON_COMMAND(ID_FILE_NEW, &CMyFrame::OnFileNew)
    ON_COMMAND(ID_FILE_SAVE, &CMyFrame::OnFileSave)
    ON_COMMAND(ID_EDIT_CUT, &CMyFrame::OnEditCut)
    ON_COMMAND(ID_EDIT_COPY, &CMyFrame::OnEditCopy)
    ON_COMMAND(ID_EDIT_PASTE, &CMyFrame::OnEditPaste)
END_MESSAGE_MAP()
void CMyFrame::OnFileNew() {
    MessageBox(L"OnFileNew", L"Event", MB_OK);
}
void CMyFrame::OnFileSave() {
    MessageBox(L"OnFileSave", L"Event", MB_OK);
}
void CMyFrame::OnEditCut() {
    MessageBox(L"OnEditCut", L"Event", MB_OK);
}
void CMyFrame::OnEditCopy() {
    MessageBox(L"OnEditCopy", L"Event", MB_OK);
}
void CMyFrame::OnEditPaste() {
    MessageBox(L"OnEditPaste", L"Event", MB_OK);
}

我包括afxwin.hresource.h。加速器本身已正确加载(我使用另一个MessageBox检查了返回值。始终是1,MSDN指出,除0以外的每个值都意味着成功(。另外,当我不加载加速器时,菜单项将被弄清楚。项目本身也可以正常工作。当我单击它们时,相应的消息框会弹出。CMyFrame的标题包含DECLARE_MESSAGE_MAP()

CFrameWnd具有自己的CFrameWnd::LoadAccelTable方法。添加此行:

Frame->LoadAccelTable(MAKEINTRESOURCE(IDR_ACCELERATOR1));

CWinThread::ProcessMessageFilter如果MFC对话框有效,将处理加速器消息。但是,它在您的代码中设置的方式将将加速器传递到主帧而不是对话框。