Asignar a herramienta

Cada control tooltip puede ser asignado a ninguna, a una o a varias herramientas, o controles. Además, una vez asignada una herramienta, tambien puede ser eliminada.

Para añadir herramientas se usa el mensaje TTM_ADDTOOL, indicando en lParam un puntero a una estructura TOOLINFO, que contiene los datos necesarios para añadir un control o un rectángulo a un tooltip.

Algunos de los campos de la estructura TOOLINFO es obligatorio especificarlos. Principalmente, el primero de ellos, cbSize que contiene el tamaño de la estructura. A ese campo le asignaremos el valor sizeof(TOOLINFO).

El campo uFlags debe contener algunas banderas que indiquen, por lo menos, el tipo de contenido de otros campos:

  • TTF_IDISHWND: indica que el campo uId contiene el manipulador de ventana de un control. Si no se especifica, uId debe contener un identificador de herramienta, pero esto sólo se aplica a herramientas pertenecientes a barras de herramientas. uId también puede ser cero, si usamos un rectángulo para asociarle un tooltip.
  • TTF_SUBCLASS: para que el procedimiento de ventana del tooltip intercepte algunos mensajes del ratón, esto nos evita tener que usar el mensaje TTM_RELAYEVENT. Normalmente no será necesario controlar los mensajes de ratón para los tooltips, de modo que es más sencillo dejar que ellos los traten internamente.

El resto de las banderas no tiene uso con controles y rectángulos, y los veremos en otros capítulos.

El campo hwnd debe contener el manipulador de la ventana padre del tooltip.

uId debe contener el manipulador de ventana del control que queremos añadir al tooltip, o cero, si estamos añadiendo un área rectángular.

El campo rect indica un área rectangular a la que se asocia el tooltip. Para que se use este rectángulo uId debe ser cero, y no debe especificarse la bandera TTF_IDISHWND. Si uId contiene un identificador o un manipulador de ventana, este campo debe ser cero.

El campo hinst se usará sólo si el campo lpszText contiene un identificador de recurso de cadena.

El campo lpszText puede contener una cadena o un identificador de recurso de cadena. También puede tomar el valor LPSTR_TEXTCALLBACK, para indicar que la ventana padre debe suministrar una cadena cuando reciba el mensaje de notificación TTN_GETDISPINFO. Esta cadena es el texto que se mostrará en el tooltip.

El campo lParam sólo se usa con herramientas de barras de herramientas.

El campo lpReserved no se usa.

Asignar tooltip a un control

Para añadir un tooltip a un control (o más propiamente, un control a un tooltip, puesto que el mismo tooltip atiende a varios controles), tenemos que iniciar los miembros cbSize, hwnd, uFlags, uId y lpszText de una estructura TOOLINFO con los valores adecuados, y enviar el mensaje TTM_ADDTOOL.

TOOLINFO toolInfo = { 0 };
...

    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd = hwnd;
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.uId = (UINT_PTR)GetDlgItem(hwnd, CM_PRUEBA);
    toolInfo.lpszText = "Este botón emite un 'beep'.";
    SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);

Asignar tooltip a un rectángulo

Si se trata de añadir un área rectángular, además hay que iniciar el miembro rect, y dejar uId a cero:

TOOLINFO toolInfo = { 0 };
...

    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.uFlags = TTF_SUBCLASS;
    toolInfo.hwnd = hwnd;
    GetClientRect(hwnd, &toolInfo.rect);
    toolInfo.lpszText = "Esta es la ventana del ejemplo 87";
    SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);

En este ejemplo hemos iniciado el miembro rect con el rectángulo que define el área de cliente de la ventana padre. Si la ventana cambia de tamaño, el rectángulo asociado no lo hará, por lo que tendremos que procesar el mensaje WM_SIZE si queremos adaptar el área del tooltip al nuevo tamaño.

Eliminar un control de un tooltip

También hay que usar una estructura TOOLINFO en la que inicialemos los miembros sbSize, hwnd y uId. A continuación enviaremos el mensaje TTM_DELTOOL, con un puntero a la estructura TOOLINFO.

TOOLINFO toolInfo = { 0 };
...

    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd = hwnd;
    toolInfo.uId = (UINT_PTR)GetDlgItem(hwnd, CM_PRUEBA);
    SendMessage(hwndTip, TTM_DELTOOL, 0, (LPARAM)&toolInfo);

Si se trata de un área rectangular usaremos los campos cbSize, hwnd y rect:

TOOLINFO toolInfo = { 0 };
...
    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd = hwnd;
    GetClientRect(hwnd, &toolInfo.rect);
    SendMessage(hwndTip, TTM_DELTOOL, 0, (LPARAM)&toolInfo);

Si usamos el mensaje WM_SIZE para adaptar el área del tooltip, deberemos borrarla primero, usando este mensaje y luego volver a crearla.

Usar cadenas de recursos

Cuando añadimos herramientas a un control tooltip podemos especificar cadenas literales, como en los ejemplos anteriores, pero también podemos usar cadenas procedentes de recursos STRINGTABLE. Para ello basta con usar el identificador del recurso de cadena en el campo lpszText de la estructura TOOLINFO, y asignar al campo hinst de esa estructrua un manipulador de la instancia que contiene el recurso.

Usaremos un fichero de recursos para definir las cadenas:

STRINGTABLE
{
    STR_HABILITAR "Este botón habilita los tooltips."
}

E inicializaremos los campos de la estructura TOOLINFO de la forma adecuada:

    TOOLINFO toolInfo = { 0 };

    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd = hwnd;
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.uId = (UINT_PTR)GetDlgItem(hwnd, CM_HABILITAR);
    toolInfo.hinst = hInstance;
    toolInfo.lpszText = STR_HABILITAR;
    SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);

Ejemplo 87


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 87 win087.zip 2012-06-15 17549 bytes 127