MFC:为什么加速器不工作?

时间:2018-02-14 14:57:53

标签: c++ visual-c++ mfc

我正在尝试在继承自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。 加速器本身正确加载(我使用另一个消息框检查了返回值。它始终为1,MSDN声明除0之外的每个值都表示成功)。此外,当我不加载加速器时,菜单项显示为灰色。 物品本身也正常工作。当我单击它们时,会弹出相应的消息框。 CMyFrame的标头包含DECLARE_MESSAGE_MAP()

1 个答案:

答案 0 :(得分:3)

CFrameWnd有自己的CFrameWnd::LoadAccelTable方法。添加以下行:

Frame->LoadAccelTable(MAKEINTRESOURCE(IDR_ACCELERATOR1));
如果MFC对话框处于活动状态,

CWinThread::ProcessMessageFilter将处理加速器消息。但是在代码中设置它的方式,它会将加速器传递给主框架,而不是对话框。