terça-feira, 26 de abril de 2011

Alternando Bitmaps no Fundo de um Form.

Um leitor perguntou recentemente sobre imagens de fundo em Forms.... Apesar de já se ter escrito diversos artigos sobre este tópico, sua questão tinhas algumas novidades. Primeiramente, ele desejava que o fundo se alternasse periodicamente.
Essencialmente, a solução para isto seria a aplicação de outros artigos similares. Em primeiro lugar, para resolver a questão de se ter diversas imagens, os bitmaps devem ser carregados em um array quando o Form for criado. A mudança periódica da imagem s
Finalmente, para tratar do assunto "não leia as imagens do disco", recorremos aos resources. Um arquivo de resource é apenas um caminho para empacotar muito bem qualquer tipo de dados que será anexado ao executável durante o processo de Linkedição. Para o
BITMAP1 BITMAP IMAGE1.BMP
BITMAP2 BITMAP IMAGE2.BMP
BITMAP3 BITMAP IMAGE3.BMP
BITMAP4 BITMAP IMAGE4.BMP
BITMAP5 BITMAP IMAGE5.BMP
A primeira parte de cada linha é o identificador que você utilizará no código para capturar uma imagem em particular. A segunda parte é o tipo de resource (neste caso, bitmap). E a última parte é o nome do arquivo que deve ser utilizado para a imagem. Ist
{$R MYBMPS.RES}
Quando o executável está sendo linkeditado (um passo antes da compilação), o resource será automaticamente anexado ao executável. Para carregar as imagens do resource no array de bitmaps no programa, fiz simplesmente:
    for a := 1 to NumBmps do
    begin
       Bmps[a] := TBitmap.Create;
       Bmps[a].LoadFromResourceName(hInstance,'BITMAP'+IntToStr(a));
    end;
É basicamente isto... A seguir a listagem da Unit principal:
unit Unit1a;
interface
uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ExtCtrls, StdCtrls;
const
    NumBmps = 5;
type
    TForm1 = class(TForm)
        Timer1: TTimer;
        Edit1: TEdit;
        CheckBox1: TCheckBox;
        ListBox1: TListBox;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormPaint(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
    private
       Bmps : Array[1..NumBmps] of TBitmap;
       SelectedBmp : Integer;
    public
    { Public declarations }
    end;
var
    Form1: TForm1;
implementation
{$R *.DFM}
{$R MYBMPS.RES}
procedure TForm1.FormCreate(Sender: TObject);
var
    a : Integer;
begin
    for a := 1 to NumBmps do
    begin
        Bmps[a] := TBitmap.Create;
        Bmps[a].LoadFromResourceName(hInstance,'BITMAP'+IntToStr(a));
    end;
    SelectedBmp := 1;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
    a : Integer;
begin
    for a := 1 to NumBmps do Bmps[a].Free;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
    x,y,w,h : Integer;
begin
    w := Bmps[SelectedBmp].Width;
    h := Bmps[SelectedBmp].Height;
    for x := 0 to (Width div w) do
        for y := 0 to (Height div h) do
            Canvas.Draw(x*w,y*h,Bmps[SelectedBmp]);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Inc(SelectedBmp);
    if SelectedBmp > NumBmps then SelectedBmp := 1;
    Paint;
end;end.

Nenhum comentário:

Postar um comentário