一、前言
帮助系统对于一个成功的软件来说,是必不可少的。一个好的帮助系统可以使用户在软件使用过程中能够迅速掌握软件的操作、使用方法。Windows平台的帮助系统主要包括WinHelp标准和HtmlHelp标准两种。WinHelp标准是基于RTF格式文件的帮助系统,Visual C++ 6.0集成了这种帮助系统;HtmlHelp标准是一种基于Html文件的帮助系统,由于HtmlHelp帮助系统具有直观、简洁,支持多媒体和ActiveX技术等优点,目前,HtmlHelp帮助系统已经成为Windows平台实际的帮助标准。
HtmlHelp帮助系统可以采用Microsoft提供的HtmlHelp Workshop工具进行编写,也可以采用其他一些工具。对于采用MFC编写的软件,由于Visual C++向导框架中不支持HtmlHelp帮助系统,因此,要实现MFC与HtmlHelp帮助系统的集成,必须采用一定的方法。
本文重点讨论MFC与HtmlHelp帮助系统的集成,对于HtmlHelp帮助文件的编写,请参阅其他资料。
二、HtmlHelp帮助系统接口
正确安装HtmlHelp Workshop后,就可以通过调用HtmlHelp.lib中提供的API函数,将帮助系统集成进应用程序中。其中,最重要的接口函数为:
HWND HtmlHelp(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD dwData);
参数hwndCaller为调用HtmlHelp()的窗口句柄,pszFile为文件、URL或是经过编译的帮助文件的路径,uCommand指定了要执行的动作,dwData为uCommand所需要的参数。
对于编程人员来说,系统帮助可以分为命令帮助(响应WM_COMMAND消息)和上下文相关帮助(响应WM_CONTEXT_HELP消息)。对于用户来说,帮助系统的表现形式可以分为在帮助框架窗体中查看帮助和动态弹出窗口帮助两种形式。
三、 工程实现
(1) 建立VC++工程
利用MFC建立一个单文档工程框架,注意在向导第4步,选择Context-sensitive Help选项。为了实现HtmlHelp API函数的调用,必须将HtmlHelp.h和HtmlHelp.lib加入工程中。最简单的方法就是点击VC的Project菜单下的Add To Project->Files菜单项,启动文件对话框,选择HtmlHelp.h和HtmlHelp.lib文件,然后点击OK按钮。HtmlHelp.h和HtmlHelp.lib文件可在HtmlHelp Workshop的安装目录下找到。
然后在所建工程的Stdafx.h中,加入#include <htmlhelp.h>行。
(2) 实现命令帮助
命令帮助即用户通过点击菜单命令启动系统帮助。这种帮助的实现比较简单。通过资源管理器,添加三个菜单项,分别为帮助主题(ID_DEFAULT_HELP)、搜索(ID_HELP_FINDER)和索引(ID_HELP_INDEX)。利用ClassWizard在CMainFrame类中添加这三个菜单项的处理函数。OnDefaultHelp(),OnHelpFinder()和OnHelpIndex()。
void CMainFrame::OnDefaultHelp()
{
HtmlHelp(GetSafeHwnd(),"htmlhelpapp.chm",HH_DISPLAY_TOC,0);
}
用户通过点击帮助主题菜单后,将弹出帮助框架窗口,其中左侧浏览窗口处于“目录”页面。
void CMainFrame::OnHelpFinder()
{
HH_FTS_QUERY q;
q.cbStruct = sizeof(HH_FTS_QUERY) ;
q.fUniCodeStrings = FALSE ;
q.pszSearchQuery = "";
q.iProximity = HH_FTS_DEFAULT_PROXIMITY ;
q.fStemmedSearch = FALSE ;
q.fTitleOnly = FALSE ;
q.fExecute = FALSE ;
q.pszWindow = NULL ;
HtmlHelp(GetSafeHwnd(),"htmlhelpapp.chm",HH_DISPLAY_SEARCH,(DWORD)&q); }
用户通过点击搜索菜单后,将弹出帮助框架窗口,其中左侧浏览窗口处于“搜索”页面。该函数中HH_FTS_QUERY是HtmlHelp动态库中提供的一个数据结构,用以支持全文搜索。
void CMainFrame::OnHelpIndex()
{
HtmlHelp(GetSafeHwnd(),"htmlhelpapp.chm",HH_DISPLAY_INDEX,0);
}
用户通过点击索引菜单后,将弹出索引框架窗口,其中左侧浏览窗口处于“索引”页面。
(3)实现上下文相关帮助
所谓上下文帮助,就是当某菜单项或工具条按钮已被选中的情况下,按下F1键或Shift+F1键,将直接弹出所选菜单项或工具条按钮的相应帮助页面。
我们在创建工程时,选择了Context-sensitive Help选项,MFC自动加入了上下文相关帮助,但是这个帮助系统是基于WinHelp标准的,我们可以重载系统的WinHelp函数,使该工程支持HtmlHelp标准的上下文帮助。
void CMainFrame::WinHelp(DWORD dwData, UINT nCmd)
{
HtmlHelp(GetSafeHwnd(),"htmlhelpapp.chm",HH_HELP_CONTEXT,dwData);
}
在这里,我们忽略了WinHelp入口参数nCmd的不同取值,直接调用HtmlHelp函数,进行上下文相关帮助的显示。WinHelp函数入口参数dwData的值与uCmd参数的值相关,当进行上下文相关帮助时,dwData的值为活动程序元素的帮助主题ID。
程序元素的ID号与帮助系统的主题ID号通过HtmlHelp帮助工程中的[MAP]项和[ALIAS]项相关,在帮助工程中包含一个.h文件,用以建立程序元素的ID号与帮助主题ID号的对应关系。该文件的形式如下:
#define IDH_FILE_NEW 123136
#define IDH_FILE_OPEN 123137
……
在WinHelp标准的帮助系统中,MFC已经为程序标准元素定义了ID号(参见 AfxRes.h文件,该文件在VC++安装目录下可以找到)。所谓程序标准元素是指利用MFC程序向导生成的程序框架中,自动生成的菜单、工具条、框架、状态条等元素。