Informática Numaboa - Tutoriais e Programação
Pintando texto (masm)
Ter 20 Jan 2009 22:10 |
- Detalhes
- Categoria: Assembly Numaboa (antigo oiciliS)
- Atualização: Domingo, 21 Junho 2009 18:45
- Autor: vovó Vicki
- Acessos: 11965
Desenhando o texto
Finalmente chegamos no texto... qual era mesmo? Nós sabemos que queremos "Assembly NumaBoa", mas nosso programa ainda não sabe. Precisamos criar uma variável que contenha a string e, aproveitando o embalo, vamos chamar a classe de "Janela" e personalizar o nome da nova janela:
Agora é só chamar a função DrawText, da user32.dll. DrawText é uma função API de alto nível para saída de texto (a prima pobre desta função é a TextOut). Esta função desenha um texto formatado dentro do retângulo especificado. Ela formata o texto de acordo com o método especificado (alinhando o texto, com quebra de linha, etc):
int DrawText( HDC hDC, // manipulador do contexto modelo LPCTSTR lpString, // ponteiro da string do texto int nCount, // comprimento da string, em caracteres LPRECT lpRect, // ponteiro para a estrutura com as dimensões de formatação UINT uFormat // flags de formatação do texto );
O parâmetro nCount especifica o número de caracteres da string. Se nCount for -1, então o parâmetro lpString é considerado como um ponteiro para uma string terminada em zero e DrawText calcula o número de caracteres automaticamente.
O uFormat precisa de algumas explicações. uFormat pode ser a combinação de muitos valores diferentes, dos quais os mais comumente usados são:
Valor> | Explicação |
DT_BOTTOM | Alinha o texto na base do retângulo. Este valor precisa ser combinado com DT_SINGLELINE. |
DT_CALCRECT | Determina a largura e a altura do retângulo. Se houver várias linhas de texto, DrawText usa a largura do retângulo apontado pelo parâmetro lpRect e amplia a altura do retângulo de modo que possa conter a última linha do texto. Se houver apenas uma linha de texto, DrawText modifica o lado direito do retângulo de modo que possa conter o último caractere da linha. Em ambos os casos, DrawText retorna a altura do texto formatado mas NÃO desenha o texto. |
DT_CENTER | Centra o texto horizontalmente no retângulo. |
DT_EXPANDTABS | Expande os caracteres tab. O número default de caracteres por tab é oito. |
DT_LEFT | Alinha o texto à esquerda. |
DT_NOCLIP | Desenha sem cortes (clipping). DrawText é um pouco mais rápida quando DT_NOCLIP é usado. |
DT_RIGHT | Alinha o texto à direita. |
DT_SINGLELINE | Apresenta o texto numa linha única. Os retornos de carro e quebra de linha não quebram a linha. |
DT_TOP | Alinha o texto no topo (apenas para linha única). |
DT_VCENTER | Centra o texto verticalmente (apenas para linha única). |
Queremos nosso texto como linha única e centrado na horizontal e na vertical, portanto:
Desligando o processo de pintura com EndPaint
Lembre-se de que é preciso liberar o manipulador do contexto de dispositivo dentro da mesma resposta em que o criamos. Para não esquecer, eu costumo escrever o invoke BeginPaint e logo depois o invoke EndPaint. O miolo eu preencho posteriormente. Mas vamos lá. Já que a pintura está terminada, vamos liberar o manipulador do contexto de dispositivo mDC chamando EndPaint:
BOOL EndPaint( HWND hWnd, // manipulador da janela CONST PAINTSTRUCT *lpPaint // ponteiro para a estrutura com os dados de pintura );
Finalmentes
O resultado deste novo programa pode ser visto ao lado: a mesma janelinha que já conhecemos, mas agora com um texto colocado bem no centro da sua área cliente.
Resumo desta história:
- Chame o par BeginPaint / EndPaint como resposta de uma mensagem WM_PAINT.
- Faça o que quiser com a área cliente entre as duas chamadas.
- Se quiser repintar a área cliente em resposta a outras mensagens, existem duas possibilidades:
- Use o par GetDC / ReleaseDC e faça sua pintura entre estas duas chamadas.
- Chame InvalidateRect ou UpdateWindow para invalidar a área cliente inteira, forçando o Windows a colocar uma mensagem na lista de mensagens da sua janela, e faça a sua pintura na seção WM_PAINT.
É isso aí. E como não podia deixar de ser, o arquivo contendo todo o tutorial está disponível para download.
- << Anterior
- Próximo