As incríveis funções BitBlt
Como manipular áreas gráficas, sem ter que lidar com pontos

A função BitBlt é realmente um achado. Ela foi criada para transferir áreas gráficas entre a memória do computador e a área de vídeo, ou seja, mostrar imagens na tela do monitor. Claro, num ambiente essencialmente gráfico, seria o máximo dos absurdos não existir tal recurso. Explico melhor.

O Windows foi concebido para tornar "transparente" o hardware ao programador. No caso em estudo, o monitor e suas características de acessibilidade. Objetivo louvável, com inspiração divina. Pena que a execução foi deixada a cargo do demo.

Para levar tal empreitada a bom termo (se é que chegaram lá), criaram um sistema de funcionamento baseado em handles, que foi levado ao extremo. Nada de errado com esse sistema, onde qualquer referência a um elemento se dá não através de seu endereço real, mas de um código especial que o identifica dentro do sistema.

Nos sistemas tradicionais, se você quer "plotar" um ponto na tela, basta saber o "endereço" do tal ponto na memória que representa a tela e colocar o valor desejado nele. No Windows, você obtém um handle para algo que supostamente seria a tela, fornece as coordenadas do ponto e o sistema faz o resto. Algo como chamar uma Int do PC, usando um garoto de recados.

A principal característica da função BitBlt é que ela transfere uma área gráfica de um lugar para o outro sem se importar com o formato das áreas envolvidas. Uma imagem origem em 16 cores é automaticamente convertida para o padrão destino. O programador não precisa se preocupar com esses pequenos detalhes e pode concentrar sua atenção na obtenção de imagens otimizadas. Com isso poupa-se memória e ganha-se velocidade de processamento.

Veja a figura do cavaleiro medieval, ao lado. Ela possui 126 pontos de largura por 172 pontos de altura e foram usadas apenas 11 cores em sua estrutura. Portando, o arquivo desta imagem poderá ser definido como padrão 16 cores. Vamos admitir, para efeito de exemplo, que existe tal arquivo e que ele está gravado com o formato bitmap do Windows (bmp). Seu nome poderia ser ELMO.BMP

O primeiro passo é estabelecer o procedimento que irá mostrar nossa figura na tela. Pode ser um botão. Inicialmente vamos declarar uma variável, do tipo TBitmap, que irá receber o arquivo BMP e uma variável para o handle da figura propriamente dita. Declararemos ainda uma outra variável tipo Handle para definir o local onde "mostraremos" nossa figura. Basta fazer como está mostrado abaixo:

var
   Figura: TBitmap;    //A figura propriamente dita
   Fig,Tela: HBitmap;  //Handle do tipo Bitmap

O próximo passo é criar a variável e carregar o arquivo com a figura:

begin
   Figura:= TBitmap.Create;
   Figura.LoadFromFile('ELMO.BMP');

É preciso não esquecer de respeitar o path do arquivo e certificar-se que ele realmente existe. O passo seguinte é definir os respectivos handles:

   Fig:= Figura.Canvas.Handle; //Handle da figura
   Tela:= Form1.Canvas.Handle; //Handle onde será mostrada

Usamos as propriedades CANVAS e HANDLE dos objetos gráficos do nosso programa (o formulário e a figura). Assim, a figura será mostrada dentro da área do formulário básico do programa. Vamos agora "imprimir" a figura no formulário:

   BitBlt(Tela,0,0,126,172,Fig,0,0,SRCCOPY);

Aí está ela, a função BitBlt. Não precisa de mais nada.

Note que existem duas séries de parâmetros. A primeira define o destino da figura: Tela é o handle do local a ser usado; 0,0 são as coordenadas Coluna,Linha do canto superior esquerdo do local onde será mostrada a figura e 126,172 é o tamanho (largura,altura) da área a ser mostrada. Neste exemplo ele corresponde ao tamanho real da figura, mas poderia ser diferente.

A segunda série de parâmetros define a fonte da imagem: Fig é o handle da figura e 0,0 é o canto superior esquerdo, dentro da figura, de onde será obtida a imagem. No caso, é o canto superior esquerdo real, mas também aqui poderia ser diferente.

Note o parâmetro SRCCOPY, no final da instrução BitBlt. Ele define uma cópia sobreposta normal (no Help do Delphi tem mais sobre esses parâmetros).

Você percebeu que tanto os parâmetros que definem o tamanho, como a posição e também o início da figura podem ser mudados. Se pensou que com isso poderia criar animações e outros truques, acertou. É por aí mesmo que faremos nossas maiores proezas, mas isso fica para as próximas matérias do club TILT.

Por enquanto experimente o que viu aqui com outras imagens e locais de impressão. Exemplo: crie um objeto TImage e imprima a figura nele. Procure pelos objetos que possuem a propriedade handle e faça mais experiências.

Quando já estiver dominando o assunto, tente mostrar a figura neste local:

   Tela:= CreateDC('display',nil,nil,nil);

Boas descobertas!

 
online