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: Fr 30.01.04 03:01 
Nachdem ich mal eine Ico2Bmp Funktion benötigt habe und nichts (auch im Internet) gefunden habe, mußte ich meine eigene entwickeln. Zwar gab es Beispiele im Internet wie man Icon auf Bitmap zeichnen kann, aber das Ergebnis war halbherzig. Da wurde einfach das Icon auf Bitmap gezeichnet und das wars. Soweit das Icon alle 32x32 Pixel mit normalen Farben belegt hatte, war das Ergebnis noch ok. Nicht ok war es aber, wenn das Icon transparente Farben hatte. Da lieferten die Funktionen weiße Bereiche zurück.

Zugegeben, auch diese Funktion ist nicht perfekt, aber sie zeichnet zumindest die transparenten Bereiche korrekt.

Die Funktion erwartet drei Parameter:
  • TIcon Objekt mit der Quelle
  • TBitmap Objekt für das Ziel
  • Angabe True für Icon 16x16 und False für Icon 32x32

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
// Konvertiert Ico zu Bitmap
procedure IcoToBmpA(Ico: TIcon; Bmp: TBitmap; SmallIcon: Boolean);
var
  WH: Byte; // Width and Height
begin
  with Bmp do begin
    Canvas.Brush.Color := clFuchsia;
    TransparentColor := clFuchsia;

    Width := 32; Height := 32;
    Canvas.Draw(00, Ico);

    if SmallIcon then WH := 16 else WH := 32;
    Canvas.StretchDraw(Rect(00, WH, WH), Bmp);
    Width := WH; Height := WH;

    Transparent :=  True;
  end;
end{Popov}


Beispiel:

Es wird das TApplication.Icon übergeben und auf dem Formular gezeichnet. Dabei wird das 32x32 Icon genommen. Die transparenten Bereiche werden dabei korrekt gezeichnet (bzw. sie werden nicht gezeichnet):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    IcoToBmpA(Application.Icon, Bmp, False);
    Canvas.Draw(00, Bmp);
  finally
    Bmp.Free;
  end;
end;


Ich gebe zu, daß diese Funktion auch nicht perfekt ist. Sie geht davon aus, daß die Maxgröße eines Icons 32x32 ist. Die Farbe clFuchsia wird für die transparente Farbe mißbraucht (wehe sie kommt im Icon als Farbe vor). Allerdings kann man bei Bedarf die Funktion erweitern.

Kleiner Hinweis noch: auch wenn es hier möglich ist ein 16x16 großes Bitmapicon zu zeichnen, so wird das Ergebnis wahrscheinlich nicht so toll sein. Ein 32x32 großes Icon das zu einer 16x16 großen Bitmap gestaucht wurde sieht nicht gut aus. Allerdings gibt es Möglichkeiten auch 16x16 große Icons aus Programmen usw. zu holen. Werden sie als TIcon übergeben, so sind sie dann 32x32 Pixel groß. Hier wird jeder Pixel doppelt so breit zurückgegeben (d.h. das 16x16 Icon wird zu 32x32 konvertiert). Wird dieses Icon wieder zu einer 16x16 großen Bitmap gestaucht, dann ist daß Originalergebnis wieder korrekt zu sehen. Das Problem hier scheint das TIcon zu sein (zumindest in der Delphi 3 Version). Man kann das Icon nicht auf 16x16 oder 48x48 einstellen. Ein TIcon unter D3 ist 32x32 Pixel groß. Deshalb ist die obere Funktion mit Einschrenkung zu beachten. Vielleicht gibt es in den höheren Delphi-Versionen neue Möglichkeiten.

_________________
Popov