Сегодня рассмотрим работу с окнами справочной системы - попробуем создать несколько окон с различными элементами управление и использовать эти окна пр вызове справки из своих Delphi-программ.
Вначале расмотрим, что представляет из себя главное окно справочной системы и какие элементы управления оно содержит. Возьмем, например, справку к HHW.
Главное окно справочной системы как минимум должно содержать панель навигации, список разделов, поиск по контексту и предметный указатель.
На данный момент (если Вы читали первую и вторую часть) у нас имеется проект содержащий два топика справки. Давайте настроим наше главное окно справки и добавим в него список разделов. Для этого необходимо перейти в HHW на вкладку Contents:

Здесь и создается список таким, каким мы его хотели бы видеть. Вначале добавляем новый раздел. Для этого жмем кнопку "Insert heading" откроется окно настройки нового раздела:

Задаем название раздела, а также, если необходимо - страницу, которая будет открываться при выборе раздела. Также на вкладке "Advanced" можно настроить вид иконки, указать окно в котором будет открываться раздел, оставить комментарий и т.д.
Теперь добавим новый топик в созданный раздел. Для этого жмем кнопку "Insert a page". Откроется точно такое же окно, как и при создании раздела - заполняем необходимые поля, указываем страницу топика и эжмем "Ok".
Теперь можете скомпилировать проект и убедиться, что теперь наша справка имеет удобное содержание:
Примерно также создается и предметный указатель. А мы тем временем перейдем непосредственно к основной теме поста - созданию новых окон.
Переходим в HHW на вкладку "Project", жмем кнопку "Add/Modify window definitions" и начинаем создание новго окна:

Окно содержит несколько вкладок, каждая из которых отвечает за определенные элементы нового окна:
General - основные свойства окно, такие как тип окна: произвольная строка, задаваемая пользователем. Используется при вызове окна. Заголовок окна (Title Bar Text).
Buttons - на этой вкладке можно выбрать те кнопки, которые будут отображаться в навигационной панели окна.
Position - здесь мы можем задать положение окна (свойства Left и Top), а также размеры окна (свойства Height и Width)
Navigation Pane - если мы хотим, чтобы новое окно содержало навигационной панель и содержание, то на этой вкладке необходимо включить опцию (единственную на вкладке)
Styles - свойства окна, такие как показ окна в развернутом виде, перекрытие дочерних окон нашим окном и т.д.
Extended Styles - расширенные стили окна. Здесь можно указать такие дополнительные свойства как, например, выравнивание текста заголовка по правому краю, показ окна поверх других окон и т.д.
Files - на этой вкладке мы должны указать файлы, используемые для отображения навигации в окне, индексный файл, файл открываемый по умолчанию и т.д. Большинство свойств на этой вкладке заполняются автоматически из свойств Вашего проекта.
Итак, после недолгих манипуляций со свойствами нового окна у меня получилось вот такое новое окно с названием "Context" и заголовком "Title New Window":

Аналогичным образом Вы можете настроить сколь угодно большое количество различных по содержанию окон своей справочной систему, а мы пока продолжим и перейдем к использованию окон в своей Delphi-программе.
Вспомним как вызывался произвольный топик справочной системы:
HtmlHelp(Handle,PChar(ExtractFilePath(Application.ExeName)+'help.chm::context.htm'),HH_DISPLAY_TOPIC,0)
Вызов этого же самого топика в окне "Context" ничем не сложнее, просто необходимо указать тип окна в параметне pszFile вот так:
HtmlHelp(Handle,PChar(ExtractFilePath(Application.ExeName)+'help.chm::context.htm>Context'),HH_DISPLAY_TOPIC,0)
То есть сразу после названия файла топика необходимо указать >Тип_Окна. Элементарно.
Теперь перейдем к следующему моменту - использование popup-окон справочной службы.
Здесь у нас есть два варианта как вызывать popup-окна из своей программы.
Вариант №1. Использование ActiveX контрола.
Для этого нам необходимо импортировать в проект библиотеку HHCtrl:
После импорта hhctrl необходимо подключить в uses модуль HHCTRLLib_TLB. Теперь создаем в нашем тестовом проекте (см. содержимое проекта здесь) ещё одну кнопку с Capition "PopUp-window" и на onClick пишем:
procedure TForm5.Button3Click(Sender: TObject); var HH: THHCtrl; begin HH:=THHCtrl.Create(self); HH.TextPopup('Popup Подсказка','MS Sans Serif, 10, , BOLD',5,5,clBlack,clYellow); end;
Запускаем приложение и по клику на кнопке получаем следующий popup:

Теперь раздеремся, какие параметры мы указали при вызове метода TextPopup:
procedure TextPopup(const pszText: WideString; const pszFont: WideString; horzMargins: SYSINT; vertMargins: SYSINT; clrForeground: LongWord; clrBackground: LongWord); safecall;
pszText: WideString - текст подсказки
pszFont: WideString - шрифт, используемый в подсказке. Шрифт необходимо определять, используя следующий шаблон:
facename[, point size[, charset[ BOLD ITALIC UNDERLINE]]]
horzMargins: SYSINT; vertMargins: SYSINT; - горизонтальный и вертикальный отступы надписи в popup-окне
clrForeground: LongWord; clrBackground: LongWord - цвет надписи и цвет заднего фона popup-окна.
Вариант №2. Использование команды HH_DISPLAY_TEXT_POPUP.
Этот вариант вызова popup-окна не требует от нас использования лишних модулей, т.к. использует функцию HtmlHelp.
Вызов popup-окна с помощью команды HH_DISPLAY_TEXT_POPUP имеет следующий формат:
HtmlHelp(hwndCTRL, NULL, HH_DISPLAY_TEXT_POPUP, (DWORD)&popup);
В параметре dwData мы должны передать указатель на структуру HH_POPUP, которая содержит следующие поля:
type tagHH_POPUP = packed record cbStruct: integer; hinst:HINST; idString:UINT; pszText:LPCTStr; pt:TPoint; clrForeground:COLORREF; clrBackground:COLORREF; rcMargins:TRect; pszFont:LPCTStr; end;
cbStruct: integer - размер структуры. Этот параметр должен быть определен перед использованием структуры в HtmlHelp.
hinst:HINST - хэндл окна вызывающей программы или DLL;
idString:UINT - 0, ID ресурса или номер топика в справке.
pszText:LPCTStr - текст подсказки
pt:TPoint - определяет абсолютные координаты положения popup-окна
clrForeground:COLORREF, clrBackground:COLORREF - цвет текста и фона окна.
rcMargins:TRect - отступы в пикселях.
pszFont:LPCTStr - строка, определяющая текст подсказки.
Остается только заполнить поля структуры необходимыми данными и использовать её в вызове HtmlHelp, например так:
var HH: tagHH_POPUP; begin //заполняем поля HtmlHelpA(Handle,nil,HH_DISPLAY_TEXT_POPUP,DWORD(@HH)) end;
Какой способ более приемлим для Вас - решать вам, но на мой взгляд первый способ с использованием ActiveX контроля немного проще. Хотя бы даже потому, что popup-окно появляется точно под курсором мыши, что избавляет нас от лишней необходимости расчитывать координаты положения всплывающего окна.
Хотите оборудовать свою машину по последнему слову науки и техники? Посмотрите на камеры заднего вида для автомобилей зарубежного производства. Есть камеры сделанные в виде рамки номерного знака.
-----------------------------
| Делись! | Загружай! | Плюсуй! |
| | |












28 Июн 2010 в 1:13 дп
Влад, на Helpware.net есть пара готовых Delphi-юнитов и чудесный туториал, описывающий работу с chm-файлами из Delphi. Читал?
28 Июн 2010 в 6:35 дп
не-а, не читал. инет большой — всего много :)
28 Июн 2010 в 11:13 дп
Это был первый документ на который я наткнулся в интернете, когда стал добавлять поддержку chm-файлов в свою программу.
28 Июн 2010 в 1:24 пп
Ну значит тебе больше повезло :) Мне первый документ попался про то, что есть такая функция HtmlHelp и что её надо импортировать.