MFC自定义HtmlHelp

时间:2013-04-24 21:42:38

标签: 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_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,使用消息映射和类似的实现,也没有成功(帮助菜单项中的不同项目在这里实现并且工作正常)。知道我需要做什么来挂钩我自己的自定义帮助功能吗?

1 个答案:

答案 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);
}