【问题标题】:MFC Custom HtmlHelpMFC 自定义 HtmlHelp
【发布时间】:2013-04-18 15:19:01
【问题描述】:

我正在对旧版 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,但也没有成功(此处实现了与帮助菜单项不同的项目并且工作正常)。知道我需要做什么才能连接到我自己的自定义帮助功能吗?

【问题讨论】:

  • 您确定 ID_HELP 没有在其他地方处理吗?您的应用程序通常是最后一个获得命令消息的应用程序。 msdn.microsoft.com/en-us/library/shfzay75(v=vs.90).aspx
  • 添加另一个菜单项,例如ID_HELP2,并尝试捕获它。如果这有效,那么其他东西正在拦截 ID_HELP。

标签: winapi visual-studio-2008 mfc html-help


【解决方案1】:

您需要将ON_WM_HELPINFO() 添加到您的CMainFrame 的消息映射中。在Main Frame的头文件中定义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);
}

【讨论】:

  • 谢谢,这对 F1 来说是完美的。不幸的是,选择帮助 |帮助仍由 MFC 处理。仍然必须找出如何规避这一点......
猜你喜欢
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多