TN028: Soporte de ayuda contextual

Esta nota describe las reglas para la asignación de ayuda contextos IDs (es decir, los números de tema) y otros temas de ayuda en MFC 2.0. Soporte de ayuda sensible al contexto requiere el compilador de ayuda que está disponible en Visual C++ Professional.

Tipos de ayuda compatible

Hay dos tipos de ayuda contextual implementada en las aplicaciones de Windows. El primero, conocido como "F1 Ayuda" implica lanzamiento WinHelp con el contexto adecuado basado en el objeto activo. El segundo es el modo MAYÚS+F1. En este modo, el cursor cambia al cursor de ayuda (una combinación flecha + signo de interrogación) y el usuario procede a hacer clic en el objeto que desea obtener ayuda sobre. En ese momento, WinHelp se inicia dando ayuda para el objeto en el que el usuario hizo clic en.

Los Microsoft Foundation classes implementan ambas formas de ayuda. Además, el marco es compatible con dos comandos simples ayuda, índice de la ayuda y con ayuda.

Archivos de ayuda

Las clases de Microsoft Foundation asuman un único archivo de ayuda. Que el archivo de ayuda debe tener el mismo nombre y ruta de la aplicación (.EXE - >.HLP).

Esta es una variable de miembro CWinApp pública denominada m_pszHelpFilePath que el usuario puede cambiar si lo desea.

Rangos de contexto de ayuda

0 x 00000000 - 0x0000FFFF: definido por el usuario

0x00010000 - 0x0001FFFF: comandos (botones de menús y comandos)

   0X00010000 + ID_

nbsp;  (Nota: 0x18000 - > 0x1FFFF es práctico gama ya son identificadores de comandos > = 0 x 8000)

0x00020000 - 0x0002FFFF: ventanas y cuadros de diálogo

   0X00020000 + IDR_

nbsp;  (Nota: 0x20000 - > 0x27FFF es práctico gama ya son exámenes < = 0x7FFF)

0x00030000 - 0x0003FFFF: mensajes de error (basados en el ID de cadena de error)

   0X00030000 + IDP_

0x00040000 - 0x0004FFFF: fines especiales (áreas no cliente)

   0x00040000 + área HitTest

0x00050000 - 0x0005FFFF: controles (aquellos que no son comandos)

   0X00040000 + IDW_

Estas reglas están codificados en la implementación predeterminada de Microsoft Foundation classes. Puede reemplazarse por proporcionar implementaciones diferentes de las diversas funciones relacionadas con la ayuda de miembros.

Comandos simples "Ayuda"

Hay dos comandos simples de ayuda que son ejecutados por las Microsoft Foundation classes:

Estos dos comandos simplemente mostrar el índice de la ayuda para la aplicación y mostrar la ayuda de usuario utilizando el programa WinHelp, respectivamente.

Ayuda contextual (ayuda F1)

Se trata de la primera forma de ayuda contextual (generalmente denominado como ayuda F1). El usuario presiona F1 para obtener ayuda sobre la tarea a la mano (la ventana o menú elemento activo). No se trata de ningún especial "modo de ayuda".

La tecla F1 se suele traducir a un comando con un ID de ID_HELP por un acelerador colocado en la tabla de aceleradores de la ventana principal. El comando ID_HELP también puede ser generado por un botón con un ID de ID_HELP en el cuadro de diálogo o ventana principal. También, cuando un menú o un cuadro de diálogo está activo y el usuario presiona F1, la pulsación de tecla está codificado para traducir a un comando ID_HELP.

Sin embargo, se genera el comando ID_HELP , se distribuye como un comando normal hasta que llega un controlador de comandos (para obtener más información sobre la arquitectura de enrutamiento de comandos clases de Microsoft Foundation, consulte técnica Nota 21.) Si la aplicación está habilitada para ayuda, el comando ID_HELP será manejado por la función CWinApp::OnHelp . Puesto que el enrutamiento de comandos predeterminado no es suficiente para determinar el contexto más específico el comando siempre en su lugar se enruta al objeto application y luego sufre una ruta personalizada para obtener ayuda.

CWinApp::OnHelp intenta lanzar WinHelp en el siguiente orden

  1. Busca una llamada AfxMessageBox activa con un ID de ayuda. Si un cuadro de mensaje está actualmente activo, WinHelp se inicia con el contexto apropiado para ese cuadro de mensaje.

  2. Si ningún cuadro de mensaje está activo, CWinApp::OnHelp envía un WM_COMMANDHELP (un mensaje privado a las Microsoft Foundation classes) para la ventana activa. Si la ventana no responde lanzando WinHelp, el mismo mensaje se envía al padre de esa ventana, hasta que se procesa el mensaje o la ventana actual es una ventana de nivel superior (y por lo tanto, no tiene una ventana principal).

  3. Si el mensaje permanece sin procesar, se invoca la ayuda predeterminada. Esto se realiza mediante el envío de un comando ID_DEFAULT_HELP a la ventana principal. Este comando es generalmente asignado a CWinApp::OnHelpIndex.

Para anular globalmente los valores base de ID (0 x 10000 para comandos, 0x20000 de recursos tales como cuadros de diálogo etc.), la aplicación debe reemplazar CWinApp::WinHelp. Esto es hecho en la implementación de las aplicaciones ClassWizard y AppWizard propios, por ejemplo, ya que ambos comparten un único archivo de ayuda.

Para anular esta funcionalidad y la forma en que se determina un contexto de ayuda, una aplicación debe manejar el mensaje WM_COMMANDHELP (ver más abajo). Puede que desee proporcionar más específica ayuda enrutamiento que proporciona el marco, como sólo va tan profunda como la actual ventana MDI secundaria. O puede que desee proporcionar ayuda más específica para un diálogo--tal vez basado en el actual estado interno del objeto o control activo en el cuadro de diálogo o ventana en particular.

WM_COMMANDHELP

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

WM_COMMANDHELP es un mensaje de Windows privado de MFC que se recibe por la ventana activa cuando se solicita ayuda. Cuando la ventana recibe este mensaje, puede llamar a CWinApp::WinHelp con el contexto en el que coincide con el estado interno de la ventana.

lParam

contiene el contexto de ayuda disponible actualmente. lParam es cero si ningún contexto de ayuda ha sido determinada aún. Una implementación de OnCommandHelp puede utilizar el identificador de contexto lParam para determinar un contexto "mejor" o simplemente puede pasar a CWinApp::WinHelp.

wParam

no se utiliza y será cero.

Si la función OnCommandHelp llama a CWinApp::WinHelp, debe devolver TRUE. Devolver TRUE paradas el enrutamiento de este comando a otras clases (base) y a otras ventanas.

Modo de ayuda (Mayús + F1 Ayuda)

Esta es la segunda forma de ayuda sensible al contexto. Generalmente, se introduce este modo pulsando MAYÚS + F1 o a través del menú y la barra de herramientas. Se implementa como un comando (ID_CONTEXT_HELP). El gancho del filtro de mensajes no se usa para traducir este comando mientras un cuadro de diálogo modal o menú está activo, por lo tanto, este comando sólo está disponible para el usuario cuando la aplicación está ejecutando la bomba principal mensaje (CWinApp::Run).

Después de entrar en este modo, el cursor del ratón de ayuda se muestra en todas las áreas de la aplicación, incluso si la aplicación normalmente mostraría su cursor en esa zona (como el borde de tamaño alrededor de la ventana). El usuario es capaz de utilizar el ratón o el teclado para seleccionar un comando. En lugar de ejecutar el comando, se muestra ayuda sobre ese comando. También el usuario puede hacer clic en un objeto visible en la pantalla, como un botón en la barra de herramientas, y se mostrará la ayuda para ese objeto. Este modo de ayuda es proporcionada por CWinApp::OnContextHelp.

Durante la ejecución de este bucle, todos teclado entrada está inactivo, excepto para las claves que acceder al menú. También, traducción de comando todavía se realiza a través de PreTranslateMessage para permitir que el usuario presione una tecla de aceleración y recibir ayuda sobre ese comando.

Si hay traducciones particulares o acciones que tienen lugar en la función de PreTranslateMessage que no debería tener lugar durante el modo de ayuda MAYÚS+F1, debe comprobar al miembro m_bHelpMode de CWinApp antes de realizar esas operaciones. La aplicación de CDialog de PreTranslateMessage comprueba esto antes de llamar a IsDialogMessage, por ejemplo. Esto deshabilita el "diálogo" teclas en los cuadros de diálogo no modales durante el modo de MAYÚS+F1. Además, CWinApp::OnIdle se llama todavía durante este bucle.

Si el usuario elige un comando en el menú, se maneja como ayuda sobre ese comando (a través de WM_COMMANDHELP, véase infra). Si el usuario hace clic en un área visible de la ventana de aplicaciones, se hace una determinación de si es un no cliente o un cliente haga clic en. OnContextHelp controla la asignación de los clics no cliente a cliente clics automáticamente. Si es un cliente de clic, a continuación, envía un WM_HELPHITTEST a la ventana que se ha hecho clic. Si esa ventana devuelve un valor distinto de cero, ese valor se utiliza como el contexto para obtener ayuda. Si devuelve cero, OnContextHelp trata de la ventana principal (y su defecto, su padre y así sucesivamente). Si no puede determinarse un contexto de ayuda, el valor predeterminado es enviar un comando ID_DEFAULT_HELP a la ventana principal, que (normalmente), a continuación, se asigna a CWinApp::OnHelpIndex.

WM_HELPHITTEST

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

WM_HELPHITTEST es un mensaje de windows privada de MFC, que es recibido por la ventana activa clic durante el modo de ayuda MAYÚS+F1. Cuando la ventana recibe este mensaje, devuelve un ID de ayuda de DWORD para uso de WinHelp.

LOWORD(lParam)

contiene las coordenadas de dispositivo de eje x donde se hace clic en el ratón relativa al área cliente de la ventana.

HIWORD(lParam)

contiene las coordenadas del eje y.

wParam

no se utiliza y será cero. Si el valor devuelto es distinto de cero, se llama WinHelp con ese contexto. Si el valor devuelto es cero, la ventana principal se consulta para obtener ayuda.

En muchos casos, usted puede aprovechar código pruebas de éxito que ya tenga. Consulte la aplicación de CToolBar::OnHelpHitTest para obtener un ejemplo de manipulación el mensaje WM_HELPHITTEST (el código aprovecha el código de prueba de éxito utilizado en los botones y herramientas en CControlBar).

Compatibilidad con MFC AppWizard y MAKEHM

AppWizard crea los archivos necesarios para generar un archivo de ayuda (archivos .cnt y .hpj). También incluye un número de preelaborados.Archivos RTF que son aceptados por el compilador de ayuda de Microsoft. Muchos de los temas son completos, pero algunos pueden que deban modificarse para su aplicación específica.

Creación automática de un archivo de "ayuda de asignación" es compatible con una utilidad llamada MAKEHM. La utilidad MAKEHM puede traducir los recursos de una aplicación.Archivo de h a un archivo de asignación de la ayuda. Por ejemplo:

# define IDD_MY_DIALOGnbsp;  2000
# define ID_MY_COMMA&ND 150

se traducirá en:

HIDD_MY_DIALOGnbsp;   0x207d0
HID_MY_COMMA&ND 0X10096

Este formato es compatible con la instalación del compilador de ayuda, que asigna el ID de contexto (los números a la derecha) con nombres de tema (los símbolos en el lado izquierdo).

El código fuente de MAKEHM está disponible en la muestra de MFC de programación Utilties MAKEHM.

Agregar compatibilidad con ayuda después de ejecutar el Asistente para aplicaciones

La mejor manera de agregar ayuda para su aplicación es activar la opción "Sensibles al contexto de ayuda" en el cuadro de diálogo de opciones del Asistente para aplicaciones antes de crear la aplicación. Esa manera AppWizard agrega automáticamente las entradas de mapa de mensajes necesario a su clase derivada de CWinApp apoyo ayuda a.

Si ya ha creado su aplicación sin el apoyo de ayuda y ahora desea agregarlo, consulte la Guía del programador de Visual C++.

Ayuda sobre cuadros de mensaje

Ayuda en cuadros de mensaje (a veces llamado alertas) es compatible a través de la función AfxMessageBox un contenedor para la API de Windows de MessageBox.

Hay dos versiones de AfxMessageBox, uno para su uso con un ID de cadena y otro para su uso con un puntero a cadena (LPCSTR):

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

En ambos casos, hay un ID de ayuda opcional.

En el primer caso, el valor predeterminado de nIDHelp es 0, lo que no indica ninguna ayuda para este cuadro de mensaje. Si el usuario presiona F1 mientras como mensaje cuadro está activa, el usuario no recibirá ayuda (incluso si la aplicación es compatible con ayuda). Si esto no es deseable, un ID de ayuda debe prestarse para nIDHelp.

En el segundo caso, el valor predeterminado de nIDHelp es -1, que indica que el ID de ayuda es el mismo que nIDPrompt. Ayuda funcionará sólo si la aplicación está habilitado para ayuda, por supuesto). Debe proporcionar 0 para nIDHelp si desea que el cuadro de mensaje con ningún apoyo de ayuda. Debe desea que el mensaje de ayuda activado, pero deseo un identificador de ayuda diferentes que nIDPrompt, simplemente dar un valor positivo para nIDHelp diferente a la de nIDPrompt.

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index