0

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

4

1 回答 1

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);
}
于 2013-04-25T23:23:37.943 回答