Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MFC:为什么加速器不工作?_C++_Visual C++_Mfc - Fatal编程技术网

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

C++ MFC:为什么加速器不工作?,c++,visual-c++,mfc,C++,Visual C++,Mfc,我试图在继承自CFrameWnd的类中使用加速器,而该加速器本身在继承自CWinApp的类中使用。出于某种原因,我在加速器中定义的快捷方式不起作用 有两个类:CMyFrame(继承自CFrameWnd)和CMyApp(继承自CWinApp) 相关职能: BOOL CMyApp::InitInstance() { m_hAccel = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));

我试图在继承自
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.h
resource.h
。 加速器本身加载正确(我使用另一个messagebox检查了返回值。返回值始终为1,MSDN声明除0外的所有值都表示成功)。此外,当我没有加载加速器时,菜单项也会变灰。 这些项目本身也工作正常。当我单击它们时,会弹出相应的消息框。
CMyFrame
的标题包含
DECLARE\u MESSAGE\u MAP()
CFrameWnd
有自己的方法。添加此行:

Frame->LoadAccelTable(MAKEINTRESOURCE(IDR_ACCELERATOR1));

如果MFC对话框处于活动状态,
CWinThread::ProcessMessageFilter
将处理加速器消息。但是,按照代码中的设置方式,它会将加速器传递到主框架,而不是对话框。

非常感谢。由于某种原因,上次我试着说它不起作用。这次我把调用放在
CMyFrame::InitInstance()
中,就在
Frame->ShowWindow(SW\u NORMAL)
之前,它成功了!