2

我想在主 chm 文件窗口中的合并 chm 文件中打开主题。我有应用程序帮助的主要 chm 文件。所以这个主 chm 文件包括子 chm 文件。我想通过调用htmlhelp函数在主chm文件窗口中打开子(合并)chm文件中的主题。

以下是主chm项目中的头文件。而operation\ACORD_geometry.chm是合并的chm文件。现在我正在使用 Adob​​e robohelp。

[ALIAS]
  IDH_operation_geometry=operation\ACORD_geometry.chm:\HID_geometrytab_functions.htm

[MAP]
  #define IDH_operation_geometry    9001

我通过以下方式调用 htmlhelp 函数。但话题打不开。.\help\3DFEMGeo.chm 是主 chm 文件。

HtmlHelp(Application.Handle, '.\help\3DFEMGeo.chm', HH_HELP_CONTEXT, 9001);

请教我在子chm中打开主题的方法。

4

1 回答 1

3

通过合并多个帮助项目的索引和 TOC,创建模块化帮助系统有一些好处,但有时很难克服障碍。以下说明的某些部分已在多年前由 Sean Stagmer 发布。有关上下文相关的帮助,另请参阅底部的内容和链接:

http://www.help-info.de/en/Help_Info_HTMLHelp/hh_context-id.htm

长话短说(HTH - 请尝试您的需求和环境):

// *** BEGIN CODE SNIPPET
...
HID_TOPIC_ID1="ms-its:Master.chm::/SubHelpSubject1.chm::/Topic_1.htm#Topic1"
HID_TOPIC_ID2="ms-its:Master.chm::/SubHelpSubject2.chm::/Topic_2.htm#Topic2"
...
// *** END CODE SNIPPET

还有故事长版:

RoboHelp 例如和许多其他帮助创作工具 (HAT's) 是利用 Microsoft HTML 帮助编译器 (hhw.exe) 的 IDE 前端。RoboHelp 旧版本的设计者在分离构建 HTML 编译帮助文件的技术方面做得非常好,但如果您直接使用底层工具,就会遗漏一些可用的功能。具体来说,模块化帮助。我假设大多数研究这个主题的人都学会了将以下内容添加到他们的帮助项目文件(.hhp)中以开始设计模块化 HTML 帮助系统:

// *** BEGIN CODE SNIPPET
[MERGE FILES]
SubHelpSubject1.chm
SubHelpSubject2.chm
...
// *** END CODE SNIPPET

现在,在模块化设计中处理上下文相关帮助和合并文件的主题增加了一个新的转折点:如何将主题 ID 映射到适当的合并 HTML 文件?作为模块化,主题 ID 不在主/主机帮助文件中,而是通过合并的子帮助项目的 .chm 文件集成到其中。这是通过将以下代码放入主控/主机主控的 TOC 文件中来完成的:

// *** BEGIN CODE SNIPPET
...
<LI>
<OBJECT type="text/sitemap">
  <param name="Name" value="SubHelpSubject1">
</OBJECT>
<OBJECT type="text/sitemap">
  <param name="Merge" value="SubHelpSubject1.chm::\SubHelpSubject1.hhc">
</OBJECT>
<LI>
<OBJECT type="text/sitemap">
  <param name="Name" value="SubHelpSubject2">
</OBJECT>
<OBJECT type="text/sitemap">
  <param name="Merge" value="SubHelpSubject2.chm::\SubHelpSubject2.hhc">
</OBJECT>
...
// *** END CODE SNIPPET

通过这两个添加(MERGE FILES 语句和对 TOC 文件的添加),主题 id 对其帮助主题信息的正确解析就完成了,除了您注意到 HTML 帮助窗口仅显示子帮助项目的 TOC它映射到!主/主机目录根本不显示。是什么赋予了?

答案在于主/主机项目的别名文件。作为一个优秀的小型 HTML 帮助内容开发人员,您知道通过修改简单的别名语法将感兴趣的主题 id 映射到适当的子帮助文件,如下所示:

// *** BEGIN CODE SNIPPET
...
HID_TOPIC_ID1=Topic_1.htm
HID_TOPIC_ID2=Topic_2.htm
...
// *** END CODE SNIPPET

...对此:

// *** BEGIN CODE SNIPPET
...
HID_TOPIC_ID1="ms-its:SubHelpSubject1.chm::/Topic_1.htm#Topic1"
HID_TOPIC_ID2="ms-its:SubHelpSubject2.chm::/Topic_2.htm#Topic2"
...
// *** END CODE SNIPPET

那个小小的 'ms-its:' 很像你在 Web 浏览器中输入的 'http:' 或 'ftp:' 文本:它被称为 Microsoft 的异步可插入协议。它的 '::/' 部分是参考;C++ 用语中的一种“间接级别”或“引用别名”。因此,要解决上下文相关帮助主题既映射到正确的帮助主题 html 文本并保持 TOC 与主目录同步的问题,您必须添加额外的间接级别以使其工作,如下所示:

// *** BEGIN CODE SNIPPET
...
HID_TOPIC_ID1="ms-its:Master.chm::/SubHelpSubject1.chm::/Topic_1.htm#Topic1"
HID_TOPIC_ID2="ms-its:Master.chm::/SubHelpSubject2.chm::/Topic_2.htm#Topic2"
...
// *** END CODE SNIPPET

这可以理解为:“显示帮助主题 HID_TOPIC_ID1 信息时,打开 Master.chm,然后导航到 SubHelpSubject1.chm 的 HTML 文件 Topic_1.htm,然后将页面向下移动到书签 Topic1。”

万岁!您的主题弹出,主/主机目录也可见!

就像用 C++ 术语思考一样,别名文件看起来非常像我们在 C++ 类中引用功能的方式:

Result = BaseClass::SubClass1::Subclass2::DoFunctionCall();

作为旁注,此语法正在被 XML 取代 - HTML 帮助将引用集合文件 (.col) 中指定的“集合”,其中包含 XML 条目。比别名文件中的类似 PERL 的钝语法更容易阅读和理解。

于 2015-05-25T16:08:28.823 回答