Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 03.02.04 22:05 
Hier wird gezeigt wie man sein Programmfenster mit einem Bild oder einem Bildmuster veredeln kann. Das Bild wird dazu auf dem Formularfenster gekachelt. Dazu hab ich mal zwei Prozeduren geschrieben:

Variante 1:

Sie ist einfach, aber sie ist nicht auf jedem Windows und für alle Bitmaps geeignet. Zwar bereitet die Prozedur wahrscheinlich keine Problem, das hängt aber von der Windowsversion und der Grafik ab. Schuld daran ist die Funktion FillRect. In älteren Windowsversionen ist sie nur für Bitmaps bis 8x8 Pixel geignet. Hat man Windows 98b oder ME, dann kann man ohne Probleme auch größere Bitmaps benutzen. Das Problem ist, daß man dann wahrscheinlich selbst keine Probleme hat, der Benutzer eines älteren Windows aber nicht das vorgesehene Ergebnis bekommt. Deshalb sollte diese Prozedur nur für Bitmapmuster bis 8x8 Pixel benutzt werden.

Es werden zwei Parameter benötigt:
  • Canvas-Fläche des Formulars
  • Bitmapgrafik für den Hintergrund

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure FillCanvasA(Can: TCanvas; Bmp: TBitmap);
begin
  try
    Can.Brush.Bitmap := Bmp;
    Can.FillRect(Can.ClipRect);
  finally
    Can.Brush.Bitmap := nil;
  end;
end;


Aufgerufen wird die Prozedur aus OnPaint Prozedur des Formulars. Wo man die Bitmap her bekommt, bleib jedem selbst überlassen. Hier im Beispiel entnehme ich die Bitmap aus einer ImageList:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FormPaint(Sender: TObject);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    { Bild laden - Version 1 }
    //if FileExists('c:\hgrund.bmp') then Bmp.LoadFromFile('c:\hgrund.bmp');

    { Bild laden - Version 2 }
    ImageList1.GetBitmap(0, Bmp);
    FillCanvasA(Form1.Canvas, Bmp);
  finally
    Bmp.Free;
  end;
end;


Variante 2:

Diese Variante ist eigentlich überall einsetzbar. Zumindest hab ich noch keine Probleme mit ihr.

Es werden zwei Parameter benötigt:
  • Canvas-Fläche des Formulars
  • Bitmapgrafik für den Hintergrund

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure FillCanvasB(Can: TCanvas; Bmp: TBitmap);
var
  x, y: Integer;
begin
  for x := 0 to Can.ClipRect.Right div Bmp.Width do
    for y := 0 to Can.ClipRect.Bottom div Bmp.Height do
      Can.Draw(x * Bmp.Width, y * Bmp.Height, Bmp);
end;


Aufgerufen wird die Prozedur aus OnPaint Prozedur des Formulars. Wo man die Bitmap her bekommt, bleib jedem selbst überlassen. Hier im Beispiel lade ich die Bitmap aus einer Datei:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FormPaint(Sender: TObject);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    { Bild laden - Version 1 }
    if FileExists('c:\hgrund.bmp'then Bmp.LoadFromFile('c:\hgrund.bmp');

    { Bild laden - Version 2 }
    //ImageList1.GetBitmap(0, Bmp);
    FillCanvasB(Form1.Canvas, Bmp);
  finally
    Bmp.Free;
  end;
end;



Hinweis:

Leider sind einige Komponenten Spielverderber. So hat z.B. die TCheckBox keine Transparent Eigenschaft (zumindest nicht in D3). Aber auch TLabel bereitet hin und wieder Probleme. So scheint trotz der Transparent -Eigenschaft hin und wieder der Original-Hintergrund durch. Hier muß man also Vorkehrungen treffen.

_________________
Popov