TN028: Поддержка контекстной справки

Эта записка описывает правила для распределения помощи контексты IDs (то есть, Тема номера) и другие вопросы помощи в MFC 2.0. Контекстно-зависимой справочной поддержки требуется компилятор справки, который доступен в Visual C++ Professional.

Типы справки поддерживается

Существует два типа контекстной справки в приложениях Windows. Во-первых, именуемая «Справка F1» включает в себя запуск WinHelp с соответствующим контекстом, основанный на текущий активный объект. Вторая — режим SHIFT + F1. В этом режиме курсор мыши изменяется на курсор справки (сочетание стрелки + знак вопроса), и пользователь переходит к щелкните на объект, на который они хотели бы помощь на. В этот момент WinHelp запускается, давать справки для объекта, на котором пользователь щелкнул.

Microsoft Foundation классы реализуют обе эти формы помощи. Кроме того платформа поддерживает два простых Справка команды, указателе справки и использование.

Файлы справки

Классов Microsoft Foundation предполагают один файл справки. Файл справки должны иметь то же имя и путь, что приложение (.EXE - >.ГВУ).

Это государственные CWinApp члена переменная с именем m_pszHelpFilePath , который пользователь может изменить при необходимости.

Диапазоны контекста справки

0x00000000 - 0x0000FFFF: определяемые пользователем

0x00010000 - 0x0001FFFF: команды (меню/командные кнопки)

   0X00010000 + ID_

nbsp;  (Примечание: 0x18000 - > 0x1FFFF это практический так как идентификаторы команд > = 0x8000)

0x00020000 - 0x0002FFFF: окна и диалоги

   0X00020000 + IDR_

nbsp;  (Примечание: 0x20000 - > 0x27FFF это практический так как РДЭ < = 0x7FFF)

0x00030000 - 0x0003FFFF: сообщения об ошибках (основанный на ID ошибки строки)

   0X00030000 + IDP_

0x00040000 - 0x0004FFFF: специального назначения (не клиентской области)

   0x00040000 + HitTest район

0x00050000 - 0x0005FFFF: контроль (те, которые не являются команды)

   0X00040000 + IDW_

Эти правила являются, в реализации по умолчанию классов Microsoft Foundation. Они могут быть переопределены предоставляя различные реализации различных функций-членов, справки.

Простые команды «Помочь»

Существует два простых команд помощи, которые осуществляются классов Microsoft Foundation:

Эти две команды просто показать указатель справки для приложения и показать пользователя справку по использованию программы WinHelp, соответственно.

Контекстно-зависимая справка (Справка F1)

Это первая форма контекстной справки (обычно именуемой Справка F1). Пользователь нажимает клавишу F1 для получения справки о задании (активное окно или элемент меню). Никаких специальных «режим справки» участвует.

Клавиши F1 обычно переводится на команду с Идентификатором ID_HELP ускорителя, помещены в таблицу сочетаний клавиш главного окна. Команда ID_HELP также могут быть созданы кнопки с Идентификатором ID_HELP на основной окне или диалоговом окне. Кроме того когда активен меню или диалоговое окно и пользователь нажимает клавишу F1, нажатие клавиши жестко перевести на ID_HELP команды.

Однако, созданный командой ID_HELP , маршрутизируется нормальной команды до тех пор, пока достигнет обработчик команды (для более подробную информацию о маршрутизации команд архитектуры классов Microsoft Foundation называть техническое примечание 21.) Если приложение является помощь включена, команда ID_HELP будет заниматься CWinApp::OnHelp функции. Так как по умолчанию Маршрутизация команд не является достаточным для определения наиболее конкретный контекст команда вместо этого всегда направляется на объект приложения и затем проходит пользовательских маршрутизации для помощи.

CWinApp::OnHelp пытается запустить WinHelp в следующем порядке

  1. Проверки для разговора AfxMessageBox с помочь код. Если окно сообщения в настоящее время, WinHelp запускается в контексте соответствующих для этого окна сообщения.

  2. Если окно сообщения не активен, CWinApp::OnHelp посылает WM_COMMANDHELP (сообщение частных классов Microsoft Foundation) к активному окну. Если это окно не отвечает, начав WinHelp, то же сообщение затем отправляется в родительского окна, до тех пор, пока сообщение обрабатывается или текущее окно является окном верхнего уровня (и поэтому не имеет родительского окна).

  3. Если сообщение остается необработанной, вызывается по умолчанию Справка. Это делается путем отправки команды ID_DEFAULT_HELP в главное окно. Эта команда обычно сопоставляется с CWinApp::OnHelpIndex.

Чтобы глобально изменить базовые значения ID (0x10000 для команд, 0x20000 ресурсов таких как диалоговые окна и так далее), приложение следует переопределить CWinApp::WinHelp. Это на самом деле делается в осуществлении ClassWizard и AppWizard приложений, например, так как оба разделяют один файл справки.

Чтобы переопределить эту функциональность и то, что помощь контекст определяется, приложение должно обрабатывать сообщение WM_COMMANDHELP (см. ниже). Вы, возможно, пожелает представить более конкретную помощь маршрутизации, чем в Рамочной договоренности предусматривается, как она выходит только глубоко текущее дочернее окно MDI. Или вы, возможно, пожелает представить более конкретную помощь для конкретного окна или диалогового окна — возможно на основе текущего внутреннего состояния этого объекта или активного элемента управления в диалоговое окно.

WM_COMMANDHELP

afx_msg LRESULT CWnd::OnCommandHelp (WPARAM, LPARAM lParam)

WM_COMMANDHELP это MFC частных Windows сообщение, получает активного окна, когда помощь запрашивается. Когда окно получает это сообщение, он может вызвать CWinApp::WinHelp с контекстом, который соответствует внутреннего состояния окна.

lParam

содержит в настоящее время доступна контекста справки. lParam равно нулю, если контекст не помощь еще не определено. Реализация OnCommandHelp можно использовать Идентификатор контекста в lParam определить контекст "лучше" или можно просто передать его CWinApp::WinHelp.

wParam

не используется, и будет равно нулю.

Если OnCommandHelp функция вызывает CWinApp::WinHelp, он должен возвращать значение TRUE. Возвращение TRUE остановки маршрутизации этой команды для других классов (базовые классы) и другие окна.

Режим справки (Shift + F1 Справка)

Это вторая форма контекстной справки. Как правило этот режим ввода, нажав SHIFT + F1 или через меню/Панель инструментов. Он реализован в виде команды (ID_CONTEXT_HELP). Обработчик фильтра сообщений не используется для перевода этой команды во время модального диалогового окна или меню активен, поэтому эта команда доступна только для пользователей при выполнении приложения основной конвейер сообщений (CWinApp::Run).

После входа в этот режим, курсор мыши справки отображается над всеми районами приложения, даже если приложение обычно показать его собственный курсор для этой области (таких, как границы окна). Пользователь имеет возможность использовать мышь или клавиатуру для выбора команды. Вместо того, чтобы выполнить команду, отображается справка по команде. Также пользователь может щелкнуть видимый объект на экране, таких как кнопки на панели инструментов и Справка будет отображаться для этого объекта. Этот режим помощь обеспечивается CWinApp::OnContextHelp.

В ходе выполнения этого цикла, все ввод с клавиатуры неактивна, за исключением ключей доступа к меню. Кроме того командование перевод до сих пор осуществляется через PreTranslateMessage , чтобы позволить пользователю нажать клавишу вызова и получить помощь по этой команде.

Если есть конкретные переводы или действия, происходящие в функции PreTranslateMessage , которая не должна иметь место во время режима справки SHIFT + F1, вы должны проверить m_bHelpMode член CWinApp перед выполнением этих операций. Осуществление CDialog PreTranslateMessage проверяет это перед вызовом IsDialogMessage, к примеру. Это отключает «диалоговое окно навигации» ключей на немодальные диалоги в режиме SHIFT + F1. Кроме того CWinApp::OnIdle вызывается во время цикла.

Если пользователь выбирает команду из меню, он обрабатывается как справки по этой команде (через WM_COMMANDHELP, см. ниже). Если пользователь щелкает видимой области окна приложения, производится определение того, является ли оно неклиентские или клиент, нажмите. OnContextHelp обрабатывает, картирование неклиентские кликов на щелчки клиент автоматически. Если это клиент нажмите, затем он посылает WM_HELPHITTEST в окно, которая была нажата. Если это окно возвращает ненулевое значение, это значение используется в качестве контекста для помощи. Если он возвращает ноль, OnContextHelp пытается родительского окна (а если это невозможно, его родителя и так далее). Если контекст справки не может быть определен, по умолчанию используется отправить команду ID_DEFAULT_HELP в главное окно, который (как правило) сопоставляется с CWinApp::OnHelpIndex.

WM_HELPHITTEST

afx_msg LRESULT CWnd::OnHelpHitTest (WPARAM, LPARAM lParam)

WM_HELPHITTEST — это MFC частных windows сообщение, полученное путем нажатия клавиши SHIFT + F1 Help режиме активного окна. Когда окно получает это сообщение, он возвращает Идентификатор справки DWORD для использования с WinHelp.

LOWORD(lparam)

содержит координаты оси x устройство, где была нажата мыши относительно клиентской области окна.

HIWORD(lparam)

содержит координату по оси y.

wParam

не используется, и будет равно нулю. Если возвращаемое значение не равно нулю, WinHelp вызывается с этой связи. Если возвращаемое значение равно нулю, родительское окно запрашивается помощь.

Во многих случаях вы можете использовать попадания кода возможно уже. Смотрите осуществление CToolBar::OnHelpHitTest пример обработки сообщения WM_HELPHITTEST (код использует код проверки нажатия на кнопки и подсказки в CControlBar).

Поддержка AppWizard MFC и MAKEHM

AppWizard создает необходимые файлы для создания файла справки (форматы файлов .cnt и .hpj файлы). Он также включает ряд встроенных.Файлы RTF, которые принимаются помочь компилятора Microsoft. Многие из тем, являются полными, но некоторые могут нужно изменить для конкретного приложения.

Утилиту под названием MAKEHM поддерживается автоматическое создание «картирования» файлы. Утилита MAKEHM может перевести ресурс приложения.H файла с помощью сопоставления. Например:

# define IDD_MY_DIALOGnbsp;  2000 год
# define ID_MY_COMMA&ND 150

будет переведен на:

HIDD_MY_DIALOGnbsp;   0x207d0
HID_MY_COMMA&ND 0X10096

Этот формат совместим с помощью компилятора фондом, который сопоставляет контекст IDs (номера на правой стороне) с именами тема (символы на левой стороне).

В примере MFC программирование утилиты доступен исходный код для MAKEHM MAKEHM.

Добавление поддержки справки после запуска AppWizard

Для добавления справки для приложения лучше всего установить флажок «Чувствительных к контекст Help» AppWizard в диалоговом окне Параметры перед созданием вашего приложения. Таким образом AppWizard автоматически добавляет записи в карте необходимое сообщение в свой класс, производный от CWinApp, для поддержки справки.

Если вы уже создали приложение без поддержки справки и теперь хотели бы добавить его, можно найти в Руководстве Visual C++ программист.

Справка по окна сообщений

Помощь на окнах сообщений (иногда называемый оповещения) поддерживается с помощью функции AfxMessageBox , оболочка для MessageBox Windows API.

Существует две версии AfxMessageBox, для использования с ID строки и для использования с указателем на строку (LPCSTR):

int AFXAPI AfxMessageBox(LPCSTR lpszText, UINT nType, UINT nIDHelp);
int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp)

В обоих случаях существует дополнительный Идентификатор справки.

В первом случае для nIDHelp по умолчанию является 0, что означает Справка для этого окна сообщения. Если пользователь нажимает клавишу F1, пока такие как сообщение окно активно, пользователь не получит помощь (даже если приложение поддерживает помощь). Если это не желательно, Идентификатор справки должны быть предусмотрены nIDHelp.

Во втором случае значение по умолчанию для nIDHelp-1, которое означает, что Идентификатор справки совпадает с nIDPrompt. Помощь будет работать только если приложение доступно помощь, конечно же). Вам необходимо предусмотреть 0 nIDHelp если вы хотите, чтобы окно сообщения не имеют справки поддержки. Требуется сообщение быть помощью включена, но желание другой помощи ID чем nIDPrompt, просто положительное значение для nIDHelp отличается от nIDPrompt.

Технические примечания по номеру |nbsp; Технические примечания по категориям

Index