Como implementar dicas de ferramenta in-loco

As dicas de ferramentas in-loco são usadas para exibir cadeias de caracteres de texto para objetos que foram recortados. Para obter uma ilustração, consulte Sobre controles de dica de ferramenta.

A diferença entre as dicas de ferramentas comuns e in-loco é o posicionamento. Por padrão, quando o ponteiro do mouse passa o mouse sobre uma região que tem uma dica de ferramenta associada a ela, a dica de ferramenta é exibida adjacente à região. No entanto, as dicas de ferramentas são janelas e podem ser posicionadas em qualquer lugar que você escolher chamando SetWindowPos. Criar uma dica de ferramenta in-loco é uma questão de posicionar a janela da dica de ferramenta para que ela sobreponha a cadeia de caracteres de texto.

O que você precisa saber

Tecnologias

Pré-requisitos

  • C/C++
  • Programação da interface do usuário do Windows

Instruções

Posicionando uma dica de ferramenta in-loco

Você precisa acompanhar três retângulos ao posicionar uma dica de ferramenta in-loco:

  1. O retângulo que envolve o texto completo do rótulo.
  2. O retângulo que envolve o texto da dica de ferramenta. O texto da dica de ferramenta é idêntico ao texto completo do rótulo e, normalmente, tem o mesmo tamanho e fonte. Os dois retângulos de texto terão, portanto, geralmente o mesmo tamanho.
  3. O retângulo da janela da dica de ferramenta. Esse retângulo é um pouco maior do que o retângulo de texto da dica de ferramenta que ele encerra.

Os três retângulos são mostrados esquematicamente na ilustração a seguir. A parte oculta do texto do rótulo é indicada por um plano de fundo cinza.

diagram showing a long string, half of which has a gray background, then the same string within a larger tooltip window rectangle

Para criar uma dica de ferramenta in-loco, você deve posicionar o retângulo de texto da dica de ferramenta para que ele sobreponha o retângulo de texto do rótulo. O procedimento para alinhar os dois retângulos é relativamente simples:

  1. Defina o retângulo de texto do rótulo.
  2. Posicione a janela da dica de ferramenta para que o retângulo de texto da dica de ferramenta sobreponha o retângulo de texto do rótulo.

Na prática, geralmente é suficiente alinhar o canto superior esquerdo dos dois retângulos de texto. A tentativa de redimensionar o retângulo de texto da dica de ferramenta para corresponder exatamente ao retângulo de texto do rótulo pode causar problemas com a exibição da dica de ferramenta.

O problema com esse esquema simples é que você não pode posicionar o retângulo de texto da dica de ferramenta diretamente. Em vez disso, você deve posicionar o retângulo da janela da dica de ferramenta apenas o suficiente acima e à esquerda do retângulo de texto do rótulo para que os cantos dos dois retângulos de texto coincidam. Em outras palavras, você precisa saber o deslocamento entre o retângulo da janela da dica de ferramenta e seu retângulo de texto fechado. Em geral, não há uma maneira simples de determinar essa compensação.

Implementar dicas de ferramentas in-loco

O fragmento de código a seguir ilustra como usar uma mensagem de TTM_ADJUSTRECT em um manipulador de TTN_SHOW para exibir uma dica de ferramenta in-loco. Seu aplicativo indica que o texto do rótulo está truncado definindo a variável privada fMyStringIsTruncated como TRUE. O manipulador chama uma função definida pelo aplicativo, GetMyItemRect, para recuperar o retângulo de texto do rótulo. Esse retângulo é passado para o controle de ponta de ferramenta com TTM_ADJUSTRECT, que retorna o retângulo de janela correspondente. SetWindowPos é então chamado para posicionar a dica de ferramenta sobre o rótulo.

case TTN_SHOW:
            
    if (fMyStringIsTruncated) 
    {
        RECT rc;
        
        GetMyItemRect(&rc);
        
        SendMessage(hwndToolTip, TTM_ADJUSTRECT, TRUE, (LPARAM)&rc);
        
        SetWindowPos(hwndToolTip, NULL, rc.left, rc.top, 0, 0, 
                     SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
    }

Este exemplo não altera o tamanho da dica de ferramenta, apenas sua posição. Os dois retângulos de texto estão alinhados em seus cantos superiores esquerdos, mas não necessariamente com as mesmas dimensões. Na prática, a diferença costuma ser pequena, e essa abordagem é recomendada para a maioria dos propósitos. Embora você possa, em princípio, usar SetWindowPos para redimensionar, bem como reposicionar a dica de ferramenta, fazer isso pode ter consequências imprevisíveis.

Comentários

Controles comuns versão 5.80 simplifica o uso de dicas de ferramentas in-loco pela adição de uma nova mensagem, TTM_ADJUSTRECT. Envie essa mensagem com as coordenadas do retângulo de texto do rótulo que você deseja que a dica de ferramenta sobreponha e ele retorna as coordenadas de um retângulo de janela de dica de ferramenta posicionado adequadamente.

Usando controles de dica de ferramenta