我试图在从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
。加速器本身已正确加载(我使用另一个消息框检查了返回值。它始终为1,MSDN指出除0以外的每个值都表示成功)。另外,当我不加载加速器时,菜单项也会变灰。
这些项目本身也可以正常工作。当我单击它们时,将弹出相应的消息框。
CMyFrame
的头包含DECLARE_MESSAGE_MAP()
。 最佳答案
CFrameWnd
具有自己的 CFrameWnd::LoadAccelTable
方法。添加此行:
Frame->LoadAccelTable(MAKEINTRESOURCE(IDR_ACCELERATOR1));
如果MFC对话框处于 Activity 状态,则
CWinThread::ProcessMessageFilter
将处理加速器消息。但是,在代码中设置的方式会将加速器传递到主机而不是对话框。关于c++ - MFC:为什么加速器不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48790150/