一、基础知识简介

        使用帮助提示窗口或状态栏只能提供简单、单一的帮助,无法对某一模块或应用程序整体提供系统的

帮助,因此运行Windows应用程序,需要帮助时一般都可以通过执行帮助菜单获得整个应用程序的帮助,也可以

运行某一部分时单击帮助按钮或按“F1”键获得相关的帮助。Delphi应用程序能够方便地应用帮助系统。下面介

绍应用程序动态地运行帮助系统的方法。

 

1、CHM文件的结构

        CHM(Compiled Help Manual):已编译的帮助文件,是微软新一代的帮助文件格式,利用HTML作源

文,把帮助内容以类似数据库的形式编译储存。一个主题一个html文件,然后合成一个完整的chm文件。

 

2、CHM文件反转成HTML文件的方法

        可以利用Windows自带的hh.exe文件来进行文件格式转换,语法为:hh -decompile 目标文件夹源C

HM文件名。

        hh.exe是微软windows系统程序,CHM扩展名的帮助文件默认是用hh.exe打开。如果用户此时并没有查

看chm格式的电子书文件或帮助文件,hh.exe又在进程中反复出现,则可能中了hh.exe病毒。在正常情况下不建议

用户对该类文件(hh.exe)进行随意的修改。它的存在对维护计算机系统的稳定具有重要作用。

3、使用Windows操作系统的API函数:HtmlHelpA:(HtmlHelpA位于hhctrl.ocx)

Function HtmlHelpA(hwndcaller:Longint; lpHelpFile:string; wCommand:Longint;dwData:string): HWND;

stdcall; external 'hhctrl.ocx'

具体参数含义如下:

hwndCaller:调用该函数的窗体句柄

pszFile:帮助文件的名称和位置

uCommand:帮助类型

dwData:与uCommand相匹配的附加参数,定位CHM的关键字。

在使用的时候,首先要定义uCommand 常数:

Const HH_DISPLAY_TOPIC = $0

Const HH_DISPLAY_INDEX=$2

Const HH_HELP_CONTEXT = $F

Const HH_DISPLAY_SEARCH= $3

Const HH_DISPLAY_TEXT_POPUP= $E

4、HtmlHelpA的调用方法

1>、调用缺省主题帮助

HtmlHelpA(Application.Handle, 'help.chm',HH_DISPLAY_TOPIC , 'Index.html');

此调用方式用于没有上下文ID号(HelpContext)的情形,dwData可指定CHM文件内的存在或缺省htm文件。

2>、调用关键字帮助

HtmlHelpA(Application.Handle, 'help.chm', HH_DISPLAY_INDEX , '关键字');

此调用方式中dwData取索引文件(.hhk)中存在的关键字。

3>、调用上下文敏感帮助

HtmlHelpA(Application.Handle, 'help.chm', HH_HELP_CONTEXT , 1000);

此调用方式用于含有映射信息的CHM文件,dwData取映射表中存在的ID号。当为0时则不调用帮助文件。

4>、调用全文搜索帮助

HtmlHelpA(Application.Handle, 'help.chm', HH_DISPLAY_SEARCH , Query);// Query为HH_FTS_QUERY

此调用方式dwData参数指定一个指向HH_FTS_QUERY结构的指针。

5>、调用弹出式帮助

HtmlHelpA(Application.Handle, 'help.chm', HH_DISPLAY_TEXT_POPUP, Popup);// Popup为HH_POPUP

此调用方式PazFile通常取空,也可以指定一个CHM和一个在该CHM文件中的TEXT文件;dwData参数指定

一个指向HH_POPUP结构的指针。

5、为CHM文件指定显示窗体形式

        由于显示帮助文件的缺省窗体是在编译该CHM文件时的窗体,因此为了更好地控制帮助文件的显示,

在制作CHM文件时,可以自定义一个窗体形式。在程序中可以通过两种方法来调用自定义窗体。当uCommand

为HH_DISPLAY_TOPIC或HH_HELP_CONTEXT时,在pszFile文件名的后面加上窗体名称: 'help.chm>Form4'

二、制作CHM帮助文件

        关于制作CHM文件的工具,我们可以使用微软的 HTMLHelpWorkshop(以下简称HHW)或者“国华软件工

作室”的eTextWizard(电子文档处理器,以下简称EW)。以HHW为例:假设我们制作好的主页放在C:\test目录中,

其中有一个index.html,通过它可以链接到所有其他的文件。

具体步骤:

1、打开HTMLHelpWorkshop,单击“File→New”菜单(或者单击工具栏第一个按钮),出现“New”对话框,选

择其中的“Project”后,按“OK”,创建一个工程。

2、这一步的对话框提供了从*.hlp到*.chm文件的转换,在此我们不需要,直接按“下一步”。

3、这一步的对话框要求指定工程的位置。单击“Browse”,进入C:\test目录,并在文件名中键入“test”,

这时文本框中应出现“C:\test\test.hlp”,然后按“下一步”。

4、这一步要求选择你已为工程创建的文件类型,在此我们选择第三个“HTMLfiles(.htm)”。

5、现在需要添加我们制作好的HTML文件,按“Add”,选择“C:\test\index.html”,将它添加到列表框。然

后单击“完成”即可。 注意:只要被index.html文件直接或间接链接到的文件,都会包含进去,因此不必将

所有的文件添加进去!

6、单击“File→Compile…”(或工具栏第三个按钮),出现“Createacompiledfile”对话框,直接单击

“Compile”。

7、测试

        在资源管理器中双击生成的C:\test\test.chm,在页面单击右键,在菜单中选择“属性”,在“属性”

对话框中复制其中的“地址”(应该为mk: @MSITStore:C:\test\test.chm::/index.html)。将上面的地址粘贴

到浏览器的地址栏中,如果正确,按回车可以在浏览器中看到正确的页面。

 

三、非关联的CHM帮助

在Delphi中,可以通过ShellExecute函数直接调用chm帮助文件,具体如下:

var

HWndHelp: Hwnd;

i: integer;

begin

//检查帮助窗口是否已经存在

HWndHelp := FindWindow(nil, 'conHelpTitle');

// 如果存在则关闭

if HwndHelp <> 0 then

SendMessage(HwndHelp, WM_CLOSE, 0, 0);

// uses shellapi

i := ShellExecute(handle, 'open', '.\help.chm', nil, nil, sw_ShowNormal);

// 如果i不为42

if i <> 42 then

Showmessage(' help.chm 帮助文件损坏!');

end;

四、上下文关联的CHM帮助

在Delphi中实现上下文关联的CHM帮助,可以调用Windows系统目录System32下的HHCTRL.OCX控件中

的HtmlHelpA函数实现。 需要以下几个步骤:

1、设置相关控件的HelpContext属性。

例:主窗体frmMain:10100 ,其中的文本框 edtInput:10101

2、声明HtmlHelpA函数

Function HtmlHelpA(hwndcaller:Longint; lpHelpFile:string; wCommand:Longint;dwData:string): HWND;

stdcall; external 'hhctrl.ocx'

3、  编写函数,按F1键调用帮助文档

//自定义公用函数ShowChmHelp显示不同帮助画面。

procedure ShowChmHelp(sTopic: string);

Const

HH_DISPLAY_TOPIC = $0;

var

i: integer;

begin

// 直接打开帮助文件的默认主题。HH_DISPLAY_TOPIC

i := HtmlHelpA(Application.Handle, '.\help.chm',HH_DISPLAY_TOPIC , sTopic);

if i = 0 then

begin

Showmessage(' help.chm 帮助文件损坏!');

exit;

end;

end;

function TForm4.FormHelp(Command: Word; Data: Integer;

var CallHelp: Boolean): Boolean;

begin

case Data of

10100: ShowChmHelp('frmMain.htm');

10101: ShowChmHelp('edtInput.htm');

else

ShowChmHelp('default.htm');

end;

end;

注意:在使用Form的OnHelp时,必须将Form的属性: BorderIcons| BiHelp改为TRUE才可以

Delphi 使用CHM文件制作系统帮助文档(上下文感知帮助的制作)的更多相关文章

  1. 制作chm格式的帮助文档

    学习java的人都用过jdk帮助文档,借助工具我们也可以自己生成chm格式的帮助文档, 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/2 ...

  2. phpmyadmin-您可能正在上传很大的文件,请参考文档来寻找解决方法

    phpmyadmin-您可能正在上传很大的文件,请参考文档来寻找解决方法   实这个很简单的只要更改php.ini里三个配置即可.(见下面加粗部分,改成你自己的需求即可) ; Maximum allo ...

  3. IIS下不能下载文件的docx文档,XLSX文档的设置方法(转)

    IIS下不能下载文件的docx文档,XLSX文档的设置方法 Office 2007的的界面风格默认格式中都是.DOCX,XLSX,PPTX等等后缀,连结中包含此类文件时,界面风格默认什么打不开的其实只 ...

  4. 将html版API文档转换成chm格式的API文档

    文章完全转载自: https://blog.csdn.net/u012557538/article/details/42089277 将html版API文档转换成chm格式的API文档并不是一件难事, ...

  5. ASP.NET 之XML:要插入的节点出自不同的文档上下文

    异常详细信息:   System.ArgumentException:   要插入的节点出自不同的文档上下文. 产生状况:现在有两个xml文件,我想把这两个xml合并,在给xml节点插入一个子节点时出 ...

  6. 怎样简单的制作一个CHM格式的帮助文档?

    http://jingyan.baidu.com/article/d8072ac446eb7bec95cefd0e.html 怎么制作CHM格式电子书 http://jingyan.baidu.com ...

  7. [shiro学习笔记]第四节 使用源代码生成Shiro的CHM格式的API文档

    版本为1.2.3的shiro API chm个事故文档生成. 获取shiro源代码 编译生成API文档 转换成chm格式 API 获取shiro源代码 shiro官网: http://shiro.ap ...

  8. [shiro学习笔记]第四节 使用源码生成Shiro的CHM格式的API文档

    版本号为1.2.3的shiro API chm个事故文档生成. 获取shiro源码 编译生成API文档 转换成chm格式 API 获取shiro源码 shiro官网: http://shiro.apa ...

  9. WebAPI使用多个xml文件生成帮助文档

    一.前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的xm ...

随机推荐

  1. python中lambda函数

    1.lambda函数使用如下: lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右侧的是返回值 >>> g=lambda x,y:x*y>>> g(4 ...

  2. 弄清UTF8和Unicode

    长期以来,一直对字符串编码认识比较粗略,认为支持"特殊字符"编码就是Unicode.当然,.NET平台上很少需要考虑这类问题,但搞清一些基本概念还是很有好处的. Unicode这个 ...

  3. WCF初探-18:WCF数据协定之KnownType

    KnownTypeAttribute 类概述 在数据到达接收终结点时,WCF 运行库尝试将数据反序列化为公共语言运行库 (CLR) 类型的实例.通过首先检查传入消息选择为反序列化而实例化的类型,以确定 ...

  4. Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。

    http://www.cocoachina.com/bbs/read.php?tid-282490.html Xcode6.1标准Framework静态库制作方法.工程转Framework,静态库加x ...

  5. C语言基础--二维数组

    二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...

  6. 深入理解gradle编译-Android基础篇

    深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...

  7. Spark随笔(三):straggler的产生原因

    首先,介绍前辈研究的基于MapReduce框架的outlier产生原因:其次,根据这些方面来分析Spark架构中的straggler:最后,根据阅览的优化办法,谈谈自己的看法. 一.MapReduce ...

  8. 10-20日 && 抽签问题

    Ants # include <cstdio> #include <algorithm> ; int L, n, x[MAX_N]; void solve() { ; ; i ...

  9. Python学习路程day9

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  10. html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

    * HTML5 现在已经不是 SGML(标准通用标记语言,是一种定义电子文档结构和描述其内容的国际标准语言) 的子集,主要是关于图像,位置,存储,多任务等功能的增加.   * 拖拽释放(Drag an ...