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! |