Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi MFC自定义HtmlHelp_Winapi_Visual Studio 2008_Mfc_Html Help - Fatal编程技术网

Winapi MFC自定义HtmlHelp

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

我正在维护一个遗留的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()
将调用“About”
OnAppAbout()
,但不会调用my
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对此进行调试;仅限于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处理。还是要找出如何绕过这一点。。。