我正在对传统的MFC应用程序进行维护。当用户从应用程序顶部的主菜单中选择“帮助”→“帮助”时,我需要调用自定义OnHelp()
。根据我的研究,我了解到MFC通常会自动拦截此命令并自行显示您的帮助文件。但您可以覆盖此命令并自行拦截此消息。我在消息地图中有这个:
BEGIN_MESSAGE_MAP(MyApp, MyBaseApp)
//{{AFX_MSG_MAP(MyApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_HELP, OnHelp)
//}}AFX_MSG_MAP
// Standard file based document commands
END_MESSAGE_MAP()
“关于”OnAppAbout()
被调用,但不是我的OnHelp()
(MFC仍会拦截它并自行提供帮助)。我的实现非常简单:
void MyApp::OnHelp()
{
// This never gets called
MessageBox( NULL, "HtmlHelp: MyApp", "Hey", MB_OK );
CString csHelpFile;
csHelpFile.Format( "%s/MyHelp.chm", MyDoc::GetHelpPath() );
::HtmlHelp(
NULL,
csHelpFile,
HELP_WM_HELP,
NULL );
}
我知道它没有被调用,因为我的MessageBox永远不会出现(我不能使用Visual Studio来调试它;仅消息框)。我也尝试将它楔入CMDIFrameWnd
,使用消息映射和类似的实现,也没有成功(帮助菜单项中的不同项目在这里实现并且工作正常)。知道我需要做什么来挂钩我自己的自定义帮助功能吗?
答案 0 :(得分:1)
您需要将ON_WM_HELPINFO()
添加到您的CMainFrame的消息地图中。在主框架的头文件中定义afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo);
,并在cpp文件中实现它:
BOOL CMainFrame::OnHelpInfo(HELPINFO* pHelpInfo)
{
#ifdef _DEBUG
MessageBox( NULL, "HtmlHelp: MyApp", "Hey", MB_OK );
#endif
CString csHelpFile;
csHelpFile.Format( "%s/MyHelp.chm", MyDoc::GetHelpPath() );
::HtmlHelp(
NULL,
csHelpFile,
HELP_WM_HELP,
NULL );
return CFrameWnd::OnHelpInfo(pHelpInfo);
}