由于VC++2010的AppWizard没有将Context-Sensitive HTML Help作为默认选择项,这就造成很多时候我们的系统需要帮助文件时却发现系统框架并没有提供帮助接口,作者就碰到过这种让人闹心的事情。
我经过多次的摸索,终于总结出一些经验。
我使用的方法是从一个具有Context-Sensitive HTML Help的工程复制一些跟Help有关的东西到不具有Help的工程中,从而使不具有Help的工程具有Help的功能。
复制的项目大致有:
1.与Help有关的资源文件
2.hlp目录下的文件
3.对hlp目录下的文件改名符合工程的需要
4.添加HtmlHelp支持函数
5.在工程文件中添加对HtmlHelp编译的支持
具体过程为:
假如我们不具有HtmlHelp的工程叫做NoHelpDemo,为了给其添加HtmlHelp的支持,我们需要新建一个具有HtmlHelp的工程,我取名字为HasHelpDemo。从HasHelpDemo工程中复制相关文件和资源到NoHelpDemo工程中,使NoHelpDemo也 具有HtmlHelp功能。
1.复制相关资源文件
(1)复制Menu资源。首先复制HasHelpDemo工程中的IDR_HELP_MENU资源,然后在IDR_MAINFRAME中复制Help Topics菜单,再然后在IDR_HasHelpDemoTYPE中复制Help Topics菜单,做完这三个基本上就完成了,当然也可以再查查其它Menu资源中是否还有Help Topics菜单。
(2)复制Accelerator资源。复制HasHelpDemo工程中的ID_CONTEXT_HELP和ID_HELP基本上就完成了,当然也可以检查一下其它的项目。
(3)复制String Table资源。主要复制HasHelpDemo工程中的AFX_IDS_IDLEMESSAGE、AFX_IDS_HELPMODEMESSAGE、ID_HELP_INDEX、ID_HELP_FINDER、ID_HELP_USING、ID_CONTEXT_HELP、ID_HELP等资源。
(4)复制Toolbar资源。主要IDR_MAINFRAME和IDR_MAINFRAME_256中的ID_CONTEXT_HELP按钮资源。
2.复制相关Message Map命令。打开HasHelpDemo工程中的MainFrm.cpp文件,找到Message Map段落,复制以下内容即可。
// Global help commands ON_COMMAND(ID_HELP_FINDER, CMDIFrameWnd::OnHelpFinder) ON_COMMAND(ID_HELP, CMDIFrameWnd::OnHelp) ON_COMMAND(ID_CONTEXT_HELP, CMDIFrameWnd::OnContextHelp) ON_COMMAND(ID_DEFAULT_HELP, CMDIFrameWnd::OnHelpFinder)
3.复制hlp目录下的文件并修改。复制HasHelpDemo工程中的hlp目录和其目录下所有文件到NoHelpDemo工程下,并将符合*.hh*条件的文件的名字改为目的工程的名称,最后打开.hhp文件并将其中的*.hh*改为符合目的工程的名称。
4.复制HtmlHelp支持函数。在NoHelpDemo工程的App类的构造函数中添加EnableHtmlHelp();语句。
5.复制工程文件中对HtmlHelp编译的支持。这个涉及到工程文件.vcxproj并且这个文件中内容绞多,所以一定要小心并做好备份。打开HasHelpDemo.vcxproj文件(最好使用记事本或者Notepad++打开),可以查找“hlp”,从第一个hlp行开始到最后一个hlp结束的全部内容复制到NoHelpDemo.vcxproj的对应位置下。
如果以上过程都小心且正确地完成了,那么你的工程现在也应该就支持Html Help Context-Sensitive Help了。
文字描述可能有些不太准确,可以创建两个工程亲自对比下就能明白其中的奥密。