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)
之前,它成功了!