如何在主流开发环境中使用HTML Help文件
【打印文章】
湖南长沙 宋彻
微软公司从Windows 98 开始使用的HTML HELP帮助系统是基于Web 页的更灵活的新一代帮助系统,它的应用已经很广泛。如何制作HTML HELP帮助文件并在主流集成开发环境如DELPHI5、BCB5、VB6、VC6中使用,与具体需求和环境支持程度相关,在此略谈以下心得:
一、制作HTML HELP帮助文件
建议用微软提供的HTML HELP Workshop工具,目前版本1.3以上;也有许多第三方工具,比如HTMLHelp ePublisher / HelpMATIC等等,但是制作中文内容往往容易出现乱码。
用Workshop建立一个帮助文件工程,在能够编译前,应该有以下步骤:
1. 制作HTML页
HTML页是帮助文件具体内容的载体,可以包含文字、图形、超链接等,与普通主页设计相同。可用FrontPage 等网页制作工具来设计制作。
2. 制作目录表、索引表
按照内容的相互关系及次序建立目录表,一个目录项对应一个帮助主题,一个帮助主题可对应一个HTML页;设计包含关键字的索引表让用户更快地获得所需的信息,一个关键字可对应一个HTML页。将设计好的HTML页与帮助主题目录项及关键字索引建立对应关系。
一般制作应用程序帮助系统时可根据程序的菜单来组织目录表。主菜单对应目录,而将子菜单对应子目录,叶菜单对应目录项。可给每一个菜单项一个对应关键字。
3. 设置高级特性
定制帮助文件的窗口风格,主要是根据需要选择窗口工具条按钮可用项目,隐藏 / 显示、后退、前进、主页、打印和选项等。
选择全文本搜索支持。
现在已经可以编译了,需要的话进行第4步。
4. 上下文敏感帮助
设置帮助主题编号,以便实现上下文敏感帮助,在程序运行中动态调出帮助内容。
主要的工作是按照应用程序的条理层次设计上下文ID号,建立上下文ID号与帮助主题的一一对应。
上下文ID是一个数值,赋值给需要显示上下文敏感帮助的控件(比如菜单项)的上下文编号属性,如Delphi中控件的HelpContext属性,VB中控件的HelpContextID 属性。当用户按 F1 键时,程序将自动地调用帮助并查找被当前上下文编号所定义的帮助主题内容。当前上下文编号是运行中拥有焦点的控件对象的上下文编号属性值。
编写头文件 *.h (C Header File),定义上下文ID号与帮助主题标志串的映射,标志串可以是中文字符。笔者在应用中用到了该特性,编写的头文件部分内容如下:
... ...
#define 登录 1
#define 主界面 2
#define 退出 3
#define查号 4
#define 号码维护 5
... ...
#define 查号运行流程 400
#define 选择查号 401
#define 查询类别 402
#define 提取资料 403
#define 回复 404
#define 退出查询 405
... ...
在Project选项卡中点击HtmlHelp API Information按钮,选择Alias项,添加帮助主题标志串和帮助主题的对应关系;然后选择Map项,添加编好的头文件。这样就建立了上下文ID号与帮助主题的映射关系。
编译完成后生成 .chm 文件,双击它打开浏览制作效果,也可以在WorkShop中View菜单下选择“compiled help files ...”菜单项浏览。在 WorkShop 中 test 菜单下 选择 “HTMLHelp API ...” 菜单项,在弹出窗口中选择 Command 为“HH_HELP_CONTEXT”, Map 栏中输入上下文ID 值就可以浏览做好的上下文敏感帮助内容。
二、编程使用HTML HELP帮助文件
首先要求开发与运行环境使用Win98或Windows更高版本,否则系统无法支持HTML HELP帮助文件。
1. 在VB6中使用HTML HELP帮助
VB6中实现比较简单,或者设计时将编译好的帮助文件名 *.chm 添加到工程属性中(帮助文件名字段);或者运行时代码方式将帮助文件路径名赋值给App.HelpFile属性。如需要上下文敏感帮助,将帮助文件中设计好的上下文ID,逐一赋值给对应显示上下文敏感帮助的控件的HelpContextID 属性即可。
2. 在VC6中使用HTML HELP帮助
VC使用消息处理方式实现HTML HELP帮助。HTML HELP Workshop中包含了htmlhelp.h和htmlhelp.lib库 文 件 。在VC项目中包含这两个文件,处理消息显示帮助时调用函数:
HtmlHelp(hwndCaller:HWND;pszFile:
PChar;uCommand:UINT; dwData:DWORD_PTR ):HWND
3. 在Delphi5中使用HTML HELP帮助
Delphi5并不支持HTML HELP帮助系统,它仍然使用WinHelp。笔者通过反复尝试,发现调用Windows系统目录System32下的HHCTRL.OCX,利用其中的HtmlHelpA函数接口可以自行实现HTML HELP帮助。
公共模块代码如下:
unit HTMLHELPCOMMON
interface
uses Windows;
type
DWORD_PTR = ^DWORD;
Function
HtmlHelp(hwndCaller:HWND;strFile:String;
uCommand:UINT; dwData:DWORD_PTR ):HWND;
procedure CloseHtmlHelp;
implementation
uses
SysUtils;
const
HHControlInstance:THandle=0;
dwCookie :DWORD = 0;
var
HtmlHelpA:function ( hwndCaller:HWND; pszFile:PChar ;
uCommand:UINT; dwData:DWORD_PTR ):HWND;stdcall;
function HtmlHelp(hwndCaller:HWND;strFile:String;
uCommand:UINT; dwData:DWORD_PTR ):HWND;
var
LFileName:String;
p:PChar;
begin
if HHControlInstance=0 then
begin
LFileName := StringOfChar( ' ', 256);
p := PChar( LFilename );
GetSystemDirectory(p,255);
StrCat(p,'\HHCTRL.OCX');
HHControlInstance := LoadLibrary( P );
if HHControlInstance = 0 then
raise exception.Create('Help system not installed!'#13' HTMLHELP cannot displayed!');
@HtmlHelpA := GetProcAddress( HHControlInstance, 'HtmlHelpA');
if @HtmlHelpA = nil then
raise exception.Create('Function HTMLHELP cannot loaded!');
HtmlHelpA( 0, nil,$001C , (@dwCookie));
end;
result := HtmlHelpA( hwndCaller, PChar( strFile ), uCommand, dwData );
end;
procedure CloseHtmlHelp;
begin
if HHControlInstance<>0 then
begin
HtmlHelpA( 0, nil, $001D, DWORD_PTR(dwCookie));
FreeLibrary(HHControlInstance);
end;
end;
end.
两个函数分别初始化和释放调用接口。其它模块只须按约定调用即可。例如:
HtmlHelp( handle, htmlhelpfilename+'::/welcome.htm',$0000, nil);
显示htmlhelpfilename对应的帮助文件的welcome页面。
上下文敏感帮助需要借用Delphi对WinHelp的支持。当用户按 F1 键时,程序将自动触发OnHelp事件,截获它,编写自己的处理代码即可。
... ...
Application.HelpFile := htmlhelpfilename;
tmpOnHelp := Application.OnHelp;
Application.OnHelp := AppHtmlHelp;
... ...
function TForm1.AppHtmlHelp(Command: Word; Data: Longint;
var CallHelp: Boolean): Boolean;
var ret:integer;Hfile:string;
begin
if not CallHelp then exit;
AppPath := ExtractFilePath(Application.ExeName);
Hfile := AppPath + Application.HelpFile;
case Command of
HELP_FINDER, HELP_CONTENTS:
ret := HtmlHelp(handle, pchar(Hfile), $0001, nil);
HELP_QUIT:
ret := HtmlHelp(0, '', $0012, nil);
HELP_CONTEXT:
ret := HtmlHelp(handle, pchar(Hfile), $000f, DWORD_PTR(data));
end;
result:=ret<>0;
CallHelp := False;
end;
这样,我们就有另一种方法调用帮助文件,与传统WinHelp调用方法一样:
application.helpcommand(HELP_FINDER, 0);
application.helpcommand(HELP_quit, 0);
... ...
以上代码用Delphi5企业版开发,在大型应用中运行良好。抛砖引玉,与大家共享。
4. 在BCB5中使用HTML HELP帮助
由于Delphi与BCB的同质性,实现方法一致。
另一种在BCB中使用hhctrl.ocx的方法如下:
implib hhctrl.lib hhctrl.ocx:创建库文件,加入工程中,注意包含htmlhelp.h头文件。
微软公司从Windows 98 开始使用的HTML HELP帮助系统是基于Web 页的更灵活的新一代帮助系统,它的应用已经很广泛。如何制作HTML HELP帮助文件并在主流集成开发环境如DELPHI5、BCB5、VB6、VC6中使用,与具体需求和环境支持程度相关,在此略谈以下心得:
一、制作HTML HELP帮助文件
建议用微软提供的HTML HELP Workshop工具,目前版本1.3以上;也有许多第三方工具,比如HTMLHelp ePublisher / HelpMATIC等等,但是制作中文内容往往容易出现乱码。
用Workshop建立一个帮助文件工程,在能够编译前,应该有以下步骤:
1. 制作HTML页
HTML页是帮助文件具体内容的载体,可以包含文字、图形、超链接等,与普通主页设计相同。可用FrontPage 等网页制作工具来设计制作。
2. 制作目录表、索引表
按照内容的相互关系及次序建立目录表,一个目录项对应一个帮助主题,一个帮助主题可对应一个HTML页;设计包含关键字的索引表让用户更快地获得所需的信息,一个关键字可对应一个HTML页。将设计好的HTML页与帮助主题目录项及关键字索引建立对应关系。
一般制作应用程序帮助系统时可根据程序的菜单来组织目录表。主菜单对应目录,而将子菜单对应子目录,叶菜单对应目录项。可给每一个菜单项一个对应关键字。
3. 设置高级特性
定制帮助文件的窗口风格,主要是根据需要选择窗口工具条按钮可用项目,隐藏 / 显示、后退、前进、主页、打印和选项等。
选择全文本搜索支持。
现在已经可以编译了,需要的话进行第4步。
4. 上下文敏感帮助
设置帮助主题编号,以便实现上下文敏感帮助,在程序运行中动态调出帮助内容。
主要的工作是按照应用程序的条理层次设计上下文ID号,建立上下文ID号与帮助主题的一一对应。
上下文ID是一个数值,赋值给需要显示上下文敏感帮助的控件(比如菜单项)的上下文编号属性,如Delphi中控件的HelpContext属性,VB中控件的HelpContextID 属性。当用户按 F1 键时,程序将自动地调用帮助并查找被当前上下文编号所定义的帮助主题内容。当前上下文编号是运行中拥有焦点的控件对象的上下文编号属性值。
编写头文件 *.h (C Header File),定义上下文ID号与帮助主题标志串的映射,标志串可以是中文字符。笔者在应用中用到了该特性,编写的头文件部分内容如下:
... ...
#define 登录 1
#define 主界面 2
#define 退出 3
#define查号 4
#define 号码维护 5
... ...
#define 查号运行流程 400
#define 选择查号 401
#define 查询类别 402
#define 提取资料 403
#define 回复 404
#define 退出查询 405
... ...
在Project选项卡中点击HtmlHelp API Information按钮,选择Alias项,添加帮助主题标志串和帮助主题的对应关系;然后选择Map项,添加编好的头文件。这样就建立了上下文ID号与帮助主题的映射关系。
编译完成后生成 .chm 文件,双击它打开浏览制作效果,也可以在WorkShop中View菜单下选择“compiled help files ...”菜单项浏览。在 WorkShop 中 test 菜单下 选择 “HTMLHelp API ...” 菜单项,在弹出窗口中选择 Command 为“HH_HELP_CONTEXT”, Map 栏中输入上下文ID 值就可以浏览做好的上下文敏感帮助内容。
二、编程使用HTML HELP帮助文件
首先要求开发与运行环境使用Win98或Windows更高版本,否则系统无法支持HTML HELP帮助文件。
1. 在VB6中使用HTML HELP帮助
VB6中实现比较简单,或者设计时将编译好的帮助文件名 *.chm 添加到工程属性中(帮助文件名字段);或者运行时代码方式将帮助文件路径名赋值给App.HelpFile属性。如需要上下文敏感帮助,将帮助文件中设计好的上下文ID,逐一赋值给对应显示上下文敏感帮助的控件的HelpContextID 属性即可。
2. 在VC6中使用HTML HELP帮助
VC使用消息处理方式实现HTML HELP帮助。HTML HELP Workshop中包含了htmlhelp.h和htmlhelp.lib库 文 件 。在VC项目中包含这两个文件,处理消息显示帮助时调用函数:
HtmlHelp(hwndCaller:HWND;pszFile:
PChar;uCommand:UINT; dwData:DWORD_PTR ):HWND
3. 在Delphi5中使用HTML HELP帮助
Delphi5并不支持HTML HELP帮助系统,它仍然使用WinHelp。笔者通过反复尝试,发现调用Windows系统目录System32下的HHCTRL.OCX,利用其中的HtmlHelpA函数接口可以自行实现HTML HELP帮助。
公共模块代码如下:
unit HTMLHELPCOMMON
interface
uses Windows;
type
DWORD_PTR = ^DWORD;
Function
HtmlHelp(hwndCaller:HWND;strFile:String;
uCommand:UINT; dwData:DWORD_PTR ):HWND;
procedure CloseHtmlHelp;
implementation
uses
SysUtils;
const
HHControlInstance:THandle=0;
dwCookie :DWORD = 0;
var
HtmlHelpA:function ( hwndCaller:HWND; pszFile:PChar ;
uCommand:UINT; dwData:DWORD_PTR ):HWND;stdcall;
function HtmlHelp(hwndCaller:HWND;strFile:String;
uCommand:UINT; dwData:DWORD_PTR ):HWND;
var
LFileName:String;
p:PChar;
begin
if HHControlInstance=0 then
begin
LFileName := StringOfChar( ' ', 256);
p := PChar( LFilename );
GetSystemDirectory(p,255);
StrCat(p,'\HHCTRL.OCX');
HHControlInstance := LoadLibrary( P );
if HHControlInstance = 0 then
raise exception.Create('Help system not installed!'#13' HTMLHELP cannot displayed!');
@HtmlHelpA := GetProcAddress( HHControlInstance, 'HtmlHelpA');
if @HtmlHelpA = nil then
raise exception.Create('Function HTMLHELP cannot loaded!');
HtmlHelpA( 0, nil,$001C , (@dwCookie));
end;
result := HtmlHelpA( hwndCaller, PChar( strFile ), uCommand, dwData );
end;
procedure CloseHtmlHelp;
begin
if HHControlInstance<>0 then
begin
HtmlHelpA( 0, nil, $001D, DWORD_PTR(dwCookie));
FreeLibrary(HHControlInstance);
end;
end;
end.
两个函数分别初始化和释放调用接口。其它模块只须按约定调用即可。例如:
HtmlHelp( handle, htmlhelpfilename+'::/welcome.htm',$0000, nil);
显示htmlhelpfilename对应的帮助文件的welcome页面。
上下文敏感帮助需要借用Delphi对WinHelp的支持。当用户按 F1 键时,程序将自动触发OnHelp事件,截获它,编写自己的处理代码即可。
... ...
Application.HelpFile := htmlhelpfilename;
tmpOnHelp := Application.OnHelp;
Application.OnHelp := AppHtmlHelp;
... ...
function TForm1.AppHtmlHelp(Command: Word; Data: Longint;
var CallHelp: Boolean): Boolean;
var ret:integer;Hfile:string;
begin
if not CallHelp then exit;
AppPath := ExtractFilePath(Application.ExeName);
Hfile := AppPath + Application.HelpFile;
case Command of
HELP_FINDER, HELP_CONTENTS:
ret := HtmlHelp(handle, pchar(Hfile), $0001, nil);
HELP_QUIT:
ret := HtmlHelp(0, '', $0012, nil);
HELP_CONTEXT:
ret := HtmlHelp(handle, pchar(Hfile), $000f, DWORD_PTR(data));
end;
result:=ret<>0;
CallHelp := False;
end;
这样,我们就有另一种方法调用帮助文件,与传统WinHelp调用方法一样:
application.helpcommand(HELP_FINDER, 0);
application.helpcommand(HELP_quit, 0);
... ...
以上代码用Delphi5企业版开发,在大型应用中运行良好。抛砖引玉,与大家共享。
4. 在BCB5中使用HTML HELP帮助
由于Delphi与BCB的同质性,实现方法一致。
另一种在BCB中使用hhctrl.ocx的方法如下:
implib hhctrl.lib hhctrl.ocx:创建库文件,加入工程中,注意包含htmlhelp.h头文件。
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )
【编程爱好者论坛】