Winapi MFC自定义HtmlHelp
我正在维护一个遗留的MFC应用程序。当用户选择帮助时→ 从应用程序顶部的主菜单的帮助中,我需要调用我的自定义Winapi MFC自定义HtmlHelp,winapi,visual-studio-2008,mfc,html-help,Winapi,Visual Studio 2008,Mfc,Html Help,我正在维护一个遗留的MFC应用程序。当用户选择帮助时→ 从应用程序顶部的主菜单的帮助中,我需要调用我的自定义OnHelp()。从我的研究中,我了解到MFC通常会自动截取该命令,并自动调出帮助文件。但您可以覆盖此命令并自己拦截此消息。我的消息映射中有以下内容: BEGIN_MESSAGE_MAP(MyApp, MyBaseApp) //{{AFX_MSG_MAP(MyApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_H
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()
将调用“About”OnAppAbout()
,但不会调用myOnHelp()
(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对此进行调试;仅限于MessageBox)。我还尝试使用消息映射和类似的实现将其嵌入到
CMDIFrameWnd
,但也没有成功(帮助菜单项中的另一项在这里实现,效果很好)。你知道我需要做什么才能连接到我自己的自定义帮助功能吗?你需要在你的CMInframe的消息映射中添加ON\u WM\u HELPINFO()
。定义afx\u 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);
}
您确定其他地方没有处理ID\u帮助吗?您的应用程序通常是最后一个获得命令消息的应用程序。添加另一个菜单项,例如ID_HELP2,然后尝试捕获该菜单项。如果这是有效的,那么其他的东西就是拦截ID_帮助。谢谢,这对F1来说非常有效。不幸的是,选择Help | Help仍然由MFC处理。还是要找出如何绕过这一点。。。