Открыть тему в объединенном файле chm в главном окне файла chm

Я хотел бы открыть тему в объединенном CHM-файле в основных окнах CHM-файла. У меня есть основной файл справки chm приложения. Таким образом, этот основной файл CHM включает в себя файл Sub CHM. И я хотел бы открыть тему в sub (объединенном) файле chm в окне основного файла chm, вызвав функцию htmlhelp.

Ниже приведен заголовочный файл в главном проекте chm. И операция \ACORD_geometry.chm является объединенным файлом chm. Сейчас я использую Adobe 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);

Пожалуйста, научите меня, как открыть тему в саб чм.

1 ответ

Решение

Создание модульных справочных систем имеет ряд преимуществ, объединяя индексы и оглавления нескольких справочных проектов, но преодолеть стену иногда бывает сложно. Некоторые части следующих инструкций были опубликованы Шоном Стагмером много лет назад. Для контекстно-зависимой справки см. Также содержание и ссылки внизу:

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) являются интерфейсом IDE для использования компилятора справки Microsoft HTML (hhw.exe). Дизайнеры более старых версий RoboHelp проделали довольно хорошую работу по разделению технических аспектов построения HTML-файла справки, но упустили несколько функций, доступных при непосредственном использовании базового инструмента. Конкретно, модульная помощь. Я предполагаю, что большинство людей, которые исследовали эту тему, узнали о добавлении следующего в файл проекта справки (.hhp), чтобы начать разработку модульной системы справки HTML:

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

Теперь рассмотрение темы контекстно-зависимой справки и объединенных файлов в модульной конструкции добавляет новый поворот: как можно сопоставить идентификатор темы с соответствующим объединенным HTML-файлом? Будучи модульным, идентификатор темы не находится в файле справки master/host, а вместо этого интегрируется в него через файл.chm объединенного проекта вспомогательной помощи. Это достигается путем размещения следующего кода в файле TOC master/host master:

       // *** 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 и дополнение к файлу оглавления) правильное разрешение идентификаторов тем в их справочной информации завершено, за исключением того, что вы заметили, что в окне справки HTML отображается ТОЛЬКО оглавление для проекта вспомогательной справки. это сопоставлено с! TOC master/host вообще не отображается. Что дает?

Ответ находится в файле псевдонима для проекта master/host. Будучи хорошим разработчиком справочного HTML-контента, вы знали, как сопоставить интересующий идентификатор темы с соответствующим файлом вспомогательной справки, изменив синтаксис простого псевдонима, например:

       // *** 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-it: " очень похожа на текст "http: " или "ftp: ", который вы вводите в веб-браузер: он известен как асинхронный подключаемый протокол от Microsoft. Часть "::/" является ссылкой; своего рода "уровень косвенности" или "псевдоним ссылки" на языке C++. Итак, чтобы решить проблему с тем, что раздел контекстно-зависимой справки ОБА соответствует правильному тексту html раздела справки и поддерживает синхронизацию оглавления с мастером, необходимо добавить дополнительный уровень косвенности, чтобы он работал, как показано ниже:

       // *** 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, затем перейдите к HTML-файлу SubHelpSubject1.chm Topic_1.htm, а затем перейдите на страницу вниз к закладке Topic1".

Ура! Ваша тема выскакивает, и оглавление master/host также видно!

Как и в терминах C++, файл псевдонимов очень похож на то, как мы будем ссылаться на функциональность в классе C++:

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

Как примечание, этот синтаксис заменяется XML - справка HTML будет ссылаться на "Collection", как указано в файле коллекции (.col), в котором есть записи XML. Гораздо проще читать и следовать, чем тупой PERL-подобный синтаксис в файле псевдонимов.

Другие вопросы по тегам