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) 


Neste tutorial vamos lidar com texto. Você deve estar pensando, "Escrever um texto? Grande coisa, e daí?". É que no Windows não se "escreve", se "pinta" o texto. Vamos usar a área cliente de uma janela e um contexto modelo. Leia o tutorial e fique por dentro...

Texto como objeto GUI

Se você ainda se lembra, GUI significa Interface Gráfica do Usuário. A novidade é que o Windows trata texto como imagem, portanto, texto é um objeto gráfico ou objeto GUI. Cada caractere é um conjunto de pontos (pixels) dispostos de maneira que adquiram uma aparência peculiar. É por isso que "pintamos" o texto ao invés de escrevê-lo. Observe abaixo o caractere "a" dentro do círculo vermelho: não se vê pontinho nenhum. Logo acima está o mesmo "a" aumentado algumas vezes: os pixels começam a se delinear. Agora observe a ampliação maior: numa matriz de 10 x 10 pontos, alguns estão em azul formando a letra "a". Esta matriz servirá para quaisquer caracteres gráficos que quisermos montar para esta fonte. Aliás, a fonte usada no exemplo é a Courier New.

Fonte

Podemos imaginar cada caractere da fonte como uma matriz de 10 x 10 pixels, com alguns deles "pintados" e outros "vazios". Para "pintar" uma frase, basta criar uma sequência de matrizes, usando uma para cada caractere, com os respectivos pixels "cheios e vazios".

A área cliente de uma janela

A tela do seu monitor pode apresentar vários programas simultaneamente. É claro que precisam existir regras para que um programa não "pinte" coisas na tela do outro. O Windows garante que um programa não invada a janela de outro limitando a área de pintura de cada janela à sua própria área (chamada de área cliente). A área cliente não tem o tamanho da janela. As bordas, por exemplo, não estão incluídas. Sabemos que a área cliente de uma janela não é constante: basta o usuário mudar suas dimensões que ela se modifica. É por isso que é preciso determinar a área cliente dinamicamente.

O sistema não permite a ação de "pixadores" - todas as pinturas são rigorosamente controladas. Primeiro é preciso obter uma autorização do Windows para pintar. Depois, o Windows determina o tamanho da área cliente, a fonte, as cores e outros atributos e devolve um manipulador do modelo autorizado. Este modelo é chamado de contexto de dispositivo.

O contexto de dispositivo

O contexto de dispositivo é um estrutura de dados (veja mais em "Trabalhando com Estruturas") mantida internamente pelo sistema. Este contexto geralmente está associado a um dispositivo específico, por exemplo, uma impressora ou uma tela de monitor. No caso do monitor, geralmente também está associado a uma janela em particular.

Alguns dos valores do contexto de dispositivo são atributos gráficos, como cores e fontes. Quando solicitado, o sistema cria um contexto com valores default. Estes valores podem ser mudados de acordo com as necessidades do programa e é para isso que o Windows devolve um manipulador.

Existem três formas de solicitar um manipulador de contexto de dispositivo:

  • call BeginPaint - como resposta de uma mensagem WM_PAINT,
  • call GetDC - como resposta de outras mensagens e
  • call CreateDC - para criar um contexto de dispositivo próprio.

info Observação: após utilizar o contexto de dispositivo é preciso liberá-lo. SEMPRE libere o contexto na MESMA resposta de mensagem que você utilizou para obtê-lo.

A mensagem WM_PAINT

O Windows envia uma mensagem WM_PAINT para uma janela para notificá-la de que é preciso refazer a pintura da sua área cliente. Quando uma janela que estava coberta (ou semi-coberta) por outra é novamente mostrada integralmente, o Windows põe uma mensagem WM_PAINT na lista de mensagens da janela em questão. A janela, ao receber esta mensagem, refaz a pintura da sua área cliente. Fica claro que, quando nós quisermos pintar algo na área cliente de uma janela, precisamos interceptar a mensagem WM_PAINT para efetuar o trabalho de pintura.

O retângulo inválido

O Windows sempre define a menor área para uma janela que esteja precisando de uma nova pintura. É a menor área retangular que precisa ser atualizada, o chamado retângulo inválido. Refazendo a pintura apenas no retângulo inválido, o sistema deixa de fazer muito trabalho inútil.

Quando o Windows detecta um retângulo inválido na área cliente de uma janela, ele envia uma mensagem WM_PAINT para esta janela. Como resposta a esta mensagem, a janela pode obter uma estrutura paintstruct, a qual contém, entre outras informações, as coordenadas do retângulo inválido.

Se formos processar uma mensagem WM_PAINT, no mínimo precisamos chamar o procedimento padrão do Windows (com DefWindowProc) ou validar o retângulo inválido com ValidateRect, caso contrário o Windows ficará enviando continuamente mensagens WM_PAINT.

A resposta à mensagem WM_PAINT

A seguir encontram-se as etapas de uma resposta à mensagem WM_PAINT:

  1. Obter um manipulador de contexto de dispositivo através da função BeginPaint
  2. Pintar a área cliente
  3. Liberar o manipulador com a função EndPaint

Não é preciso validar explicitamente o retângulo inválido - a chamada a BeginPaint faz isso por nós. Entre o par BeginPaint / EndPaint podemos fazer chamadas a funções para tarefas de pintura.

Informações adicionais