【发布时间】: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