A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Pintando texto (masm)

Ter

20

Jan

2009


22:10

(2 votos, média 5.00 de 5) 


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: ... .DATA NomeClasse db "Janela",0 TituloJanela db "Janela Pintada",0 NossoTexto db "Assembly NumaBoa",0

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:

... .ELSEIF uMsg == WM_PAINT invoke BeginPaint, hWnd, ADDR ps mov mDC, eax invoke GetClientRect, hWnd, ADDR eRet invoke DrawText, mDC, ADDR NossoTexto, -1, ADDR eRet, DT_SINGLELINE or DT_CENTER or DT_VCENTER ...

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
);
... .ELSEIF uMsg == WM_PAINT invoke BeginPaint, hWnd, ADDR ps mov mDC, eax invoke GetClientRect, hWnd, ADDR eRet invoke DrawText, mDC, ADDR NossoTexto, -1, ADDR eRet, DT_SINGLELINE or DT_CENTER or DT_VCENTER invoke EndPaint, hWnd, ADDR ps ...

Finalmentes

Janela com texto
O resultado

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.

mfx brokerконсилеры для лицаоставить отзывфлагманы смартфоновгригория сковородыкарандаш для губрейтинг seo

Informações adicionais