Приложение должно предельно облегчать работу пользователя, снабжая его системой подсказок, помогающих сориентироваться в приложении. Эта система включает в себя:
- Ярлычки, которые, всплывают, когда пользователь задержит курсор мыши над каким-то элементом окна приложения. В частности, такими ярлычками обязательно должны снабжаться быстрые кнопки инструментальных панелей, поскольку нанесенные на них пиктограммы часто не настолько выразительны, чтобы пользователь без дополнительной подсказки мог понять их назначение.
- Кнопка справки в полосе заголовка окна, позволяющая пользователю посмотреть во всплывающих окнах назначение различных элементов окна.
- Более развернутые подсказки в панели состояния или в другом отведенном под это месте экрана, которые появляются при перемещении курсора мыши в ту или иную область окна приложения.
- Встроенную систему контекстно-зависимой оперативной справки, вызываемую по клавише F1.
- Раздел меню Справка, позволяющий пользователю открыть стандартный файл справки Windows .hlp, содержащий в виде гипертекста развернутую информацию по интересующим пользователя вопросам.
Тексты ярлычков и подсказок панели состояния устанавливаются для любых визуальных компонентов в свойстве Hint в виде строки текста, состоящей из двух частей, разделенных символом вертикальной черты '|'. Первая часть, обычно очень краткая, предназначена для отображения в ярлычке; вторая более развернутая подсказка предназначена для отображения в панели состояния или ином заданном месте экрана. Например, в кнопке, соответствующей команде открытия файла, в свойстве Hint может быть задан текст:
Открыть|Открытие текстового файла
Как частный случай, в свойстве Hint может быть задана только первая часть подсказки без символа '|'.
Для того чтобы первая часть подсказки появлялась во всплывающем ярлычке, когда пользователь задержит курсор мыши над данным компонентом, надо сделать следующее:
- Указать тексты свойства Hint для всех компонентов, для которых вы хотите обеспечить ярлычок подсказки.
- Установить свойства ShowHint (показать подсказку) этих компонентов в true или установить в true свойство ParentShowHint (отобразить свойство ShowHint родителя) и установить в true свойство ShowHint контейнера, содержащего данные компоненты.
Конечно, можно устанавливать свойства в true или false программно, включая и отключая подсказки в различных режимах работы приложения.
При ShowHint, установленном в true, окно подсказки будет всплывать, даже если компонент в данный момент недоступен (свойство Enabled = false). Если не задано значение свойства компонента Hint, но установлено в true свойство ShowHint или установлено в true свойство ParentShowHint, а в родительском компоненте ShowHint = true, то в окне подсказки будет отображаться текст Hint из родительского компонента.
Правда, все описанное выше справедливо при значении свойства ShowHint приложения Application равном true (эта значение задано по умолчанию). Если установить Application->ShowHint в false, то окна подсказки не будут появляться независимо от значений ShowHint в любых компонентах.
Свойства Hint компонентов можно также использовать для отображения текстов заключенных в них сообщений в какой-то метке или панели с помощью функций GetShortHint и GetLongHint, первая из которых возвращает первую часть сообщения, а вторая вторую (если второй части нет, то возвращается первая часть). Например, эти функции можно использовать в обработчиках событий OnMouseMove, соответствующих прохождению курсора мыши над данным компонентом. Так обработчик:
void __fastcall TForm1::Button1MouseMove(TObject *Sender, TShiEtState Shift, int X, int У)
{
TControl *Send = (TControl *)Sender;
Panel1->Caption = GetShortHint(Send->Hint);
Panel2->Caption = GetLongHint(Send->Hint);
}
отобразит в панели Panel1 первую, а в панели Panel2 вторую часть свойства Hint всех компонентов, над которыми будет перемещаться курсор, если в этих компонентах в событии OnMouseMove указан этот обработчик Button1MouseMove. Причем это не зависит от значения их свойства ShowHint.
Пусть, например, необходимо, чтобы при нажатии некоторой кнопки Button1 вашего приложения в панели Panel1 высвечивалась подсказка пользователю, например, «Укажите имя файла», а сама кнопка имела всплывающий ярлычок подсказки с текстом «Ввод». Тогда можно задать свойству Hint этой кнопки значение «Ввод|Укажите имя файла», задать значение true свойству ShowHint, а в обработчик события нажатия этой кнопки вставить оператор:
Panel1->Caption = GetLongHint(Button1->Hint);
Если же не надо отображать ярлычок подсказки для кнопки, то можно ограничиться значением Hint, равным «Укажите имя файла», а приведенный выше оператор оставить неизменным или заменить на эквивалентный ему в данном случае оператор:
Panel1->Caption = GetShortHint (Button1->Hint);
или даже просто на оператор:
Panel1->Caption = Button1->Hint;
Перед тем моментом, когда должен отобразиться ярлычок какого-нибудь компонента, возникает событие приложения OnShowHint. В обработчике этого события можно организовать какие-то дополнительные действия, например, изменить отображаемый текст. Особенно легко работать с событиями приложения, начиная в C++Builder 5, в котором появился компонент ApplicationEvents, перехватывающий все эти события. В обработчик его события OnShowHint можно поместить те операторы, которые надо выполнить перед отображением ярлычка. Заголовок этого обработчика имеет вид:
void __fastcall TForm1::ApplicationEventslShowHint(AnsiString $HintStr, bool $CanShow, THintInfo $HintInfo)
Здесь передаваемый по ссылке параметр HintStr отображаемый в ярлычке текст. В обработчике этот текст можно изменить. Так же по ссылке передается параметр CanShow. Если в обработчике установить его равным false, то ярлычок отображаться не будет. Третий параметр, передаваемый по ссылке это HintInfo. Это структура, поля которой содержат информацию о ярлычке: его координаты, цвет, задержки появления и т.п. В частности, имеется поле HintControl компонент, сообщение которого должно отображаться в ярлычке, и поле HintStr отображаемое сообщение. По умолчанию HintInfo.HintStr первая часть свойства Hint компонента. Но в обработчике это значение можно изменить.
Имеется еще один способ отображения второй части сообщения, записанного в Hint, в строке состояния или какой-то области экрана в моменты, когда курсор мыши проходит над компонентом это использование обработки события приложения OnHint. Это событие не того компонента, над которым проходит курсор мыши, а именно приложения объекта Application. Начиная с C++Builder 5 это событие также перехватывается компонентом ApplicationEvents. Если обработчик этого события определен, то в момент прохождения курсора над компонентом, в котором задано свойство Hint, вторая часть сообщения компонента заносится в свойство Hint объекта Application. Если свойство Hint компонента содержит только одну часть, то в свойство Hint объекта Application заносится эта первая часть.
Если приложение содержит инструментальную панель с быстрыми кнопками, то, как правило, эти кнопки должны снабжаться не только всплывающими ярлычками, но и развернутыми подсказками в панели состояния. Для реализации подсказок в панели состояния надо перенести на форму панель состояния компонент StatusBar со страницы Win32. Если нужна односекционная панель, установите свойства SiraplePanel и AutoHint панели StatusBar в true. Больше ничего делать не требуется, т.к. свойство AutoHint обеспечит автоматическое отображение подсказок.
Если использовать многосекционную панель состояния, то свойство AutoHint обеспечит отображение подсказок только в первой секции. Для отображения подсказок в другой секции надо перенести на форму компонент ApplicationEvents и в обработчик его события OnHint компонента вставить оператор:
StatusBar1->Panels->Items[I]->Text = Application->Hint;
где I - индекс секции.
Более подробные пояснения пользователю может дать контекстно-зависимая справка, встроенная в приложение. Она позволяет пользователю нажать в любой момент клавишу F1 и получить развернутую информацию о том компоненте в окне, который в данный момент находится в фокусе. Для того чтобы это осуществить, надо разработать для своего приложения файл справки .help. Затем надо в каждом компоненте, для которого нужно обеспечить контекстно-зависимую справку, задать свойства, обеспечивающие ссылку на соответствующую тему.
В версиях, младше C++Builder 6, такое свойство одно HelpContext. Это номер темы, который задается в проекте справки специальной таблицей [MAP], содержащей эти условные номера и соответствующие им идентификаторы тем. В С++Builder 6 появилось еще два свойства: HelpKeyword и HelpType. Первое из них является идентификатором темы, содержащимся в сноске К. А второе определяет, каким свойством HelpContext или HelpKeyword задается ссылка на тему.
- HelpType = htContext, то используется свойство HelpContext;
- HelpType = htKeyword, то используется свойство HelpKeyword.
Если HelpContext компонента равен нулю, то данный компонент наследует это свойство от своего родительского компонента. Например, для всех компонентов, размещенных на некоторой панели можно задать HelpContext = 0, а для самой панели задать отличное от нуля значение HelpContext, соответствующее теме, описывающей назначение всех компонентов панели.
Для того чтобы все это работало, надо выполнить команду Project | Options и в окне Project Options (опции проекта) на странице Application (приложение) установить значение опции Help file, равное имени подготовленного файла .hlp. Это приведет к тому, что в головном файле проекта появится оператор вида:
Application->HelpFile = "<имя файла>.hlp";
В этом операторе используется метод HelpFile, определяющий файл справки, к которому обращается проект. Этот метод и подобный оператор можно использовать в приложении в любом обработчике события, если в какие-то моменты требуется сменить используемый файл справки.
Если предполагается, что файл справки будет расположен в том же каталоге, где находится само приложение, то имя файла и в окне Опции проекта, и в приведенном выше операторе надо задавать без указания пути. Иначе приложение, работающее на вашем компьютере, перестанет работать на компьютере пользователя, у которого каталоги не совпадают с вашими.
Для того чтобы приложение в свойствах HelpContext могло ссылаться на какой-то номер контекстной справки, в файле проекта справки .hpj в разделе [MAP] надо поместить таблицу соответствия использованных значений HelpContext и тем файла .hlp.
В заключение поговорим о традиционном разделе меню Справка, позволяющем пользователю открыть файл справки .hlp и получить развернутую информацию по всем вопросам, связанным с данным приложением. В обработчик события при выборе данного раздела меню или при нажатии соответствующих кнопок помощи вставляются операторы вида:
Application->HelpContext(<номер темы>);
Задаваемые в этих операторах номера тем аналогичны используемым при задании свойств HelpContext. Это номер той темы, которая первой отобразится при открытии окна справки. А в дальнейшем пользователь, как обычно, может перейти, работая с программой справки, к любой интересующей его теме.
Еще один механизм подсказок, связанный с файлом справок .hlp это кнопка справки, присутствующая в заголовках многих современных окон Windows. Нажав ее, пользователь может подвести курсор мыши, изменивший свою форму на вопросительный знак, к какому-то компоненту, щелкнуть и во всплывшем окне появится развернутая подсказка, поясняющая назначение данного компонента. Для того чтобы ввести такую возможность в свое приложение, надо установить в true подсвойство byHelp свойства BorderIcons формы. Однако не для всех форм это вызовет появление в заголовке окна кнопки справки. Кнопка появится только в случае, если свойство BorderStyle формы установлено в bsDialog. Никакого программирования работа с кнопкой справки не требует. Все будет выполняться автоматически. Достаточно предусмотреть в файле .hlp соответствующие темы и сделать на них ссылки в свойствах HelpContext компонентов. Эти темы будут появляться при соответствующих действиях пользователя во всплывающих окнах.