Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie TIcon gestretcht in ein TBitmap zeichnen? (https://www.delphipraxis.net/150965-wie-ticon-gestretcht-ein-tbitmap-zeichnen.html)

himitsu 1. Mai 2010 17:33


Wie TIcon gestretcht in ein TBitmap zeichnen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe in einer Komponente ein Bitmap liegen, welchem ich aus unterschiedlichen Quellen den Inhalt irgendeines Bildes geben wollte.

Zum Test übergeb ich dort jeweils das Standard-Icon der Form (hab daran nichts verändert)
und das Icon der Anwendung.

Delphi-Quellcode:
Action.Image := Self.Icon;

Action.Image := Application.Icon;
Intern wird dann dieses gemacht.
Delphi-Quellcode:
Procedure TInsightAction.AssignImage(Value: TGraphic);
  Begin
    If Assigned(Value) Then Begin
      If not Assigned(FImage) Then Begin
        FImage := TBitmap.Create;
        FImage.Width := 16;
        FImage.Height := 16;
      End;
      With FImage.Canvas do Begin
        Brush.Color := cl3DLight;
        FillRect(Rect(0, 0, 16, 16));
        //Draw(0, 0, Value);
        StretchDraw(Rect(0, 0, 15, 15), Value);
      End;
try Value.SaveToFile('a.ico'); except end;
FImage.SaveToFile('a.bmp');
    End Else FreeAndNil(FImage);
    DoChanged;
  End;
Das Problem ist nur, daß überhaupt nichts stimmt.
Bei Form.Icon wird garnichts gezeichnet und es tritt auch kein Fehler in StretchDraw oder Draw auf.
SaveToFile wirft aber diese Exception:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EInvalidGraphic mit der Meldung 'Ungültiges Symbol' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Wärend beim Applications-Icon das Speichern funktioniert, es wird auch gezeichnet, aber immer nur in Originalgröße.
Es ist das 32x32-Standardicon von Delphi und selbst wenn ich dieses mach
Delphi-Quellcode:
StretchDraw(Rect(0, 0, 5, 5), Value);
                       ^^^^
werden immer die obersten 16x16 Pixel über das gesamte Bitmap gezeichnet.

:gruebel:


[add]
Auf dem angehängten Bild sind 2 Bereiche markiert.

im Unteren liegt das Application.Icon
und im Oberen sollte 3 Mal das Form.Icon liegen.
> oben sieht man nichts
> unten sieht das Bild immer gleich aus, egal ob .Draw oder ob StretchDraw mit sonstwelchen Bildausmaßen verwendet wird.

Delphi-Quellcode:
StretchDraw(Rect(0, 0, 15, 15), Value);
                 ^^^^         Position
                       ^^^^^^ Ausmaße
Nur wenn ich die Position ändere, dann verschiebt sich das Bild.

turboPASCAL 1. Mai 2010 18:09

Re: Wie TIcon gestretcht in ein TBitmap zeichnen?
 
Ja, Delphi und die lieben Icons. Da gibt es oft Problemchen.

Versuche einmal: MSDN-Library durchsuchenDrawIconEx

himitsu 1. Mai 2010 18:30

Re: Wie TIcon gestretcht in ein TBitmap zeichnen?
 
Dann muß ich ja erstmal prüfen, ob in dem TGrafic ein Icon steht, welches ja nur geht, wenn das Icon wirklich in einem TIcon drinsteckt. :wall:
Und zusätzlich muß ich hoffen, daß es mit anderen Grafiktypen keine weiteren Probleme gibt.

Hab ja gehofft, daß ich nur zu blöd bin und irgendwas falsch mache. :roll:

himitsu 5. Mai 2010 08:30

Re: Wie TIcon gestretcht in ein TBitmap zeichnen?
 
Ach du meine Güte, der Grund, warum das Standard-Icon einer Form nicht gezeichnet wurde und warum es beim Speichern zu einer Exception kommt, war ja "einfach". :wall:

Es gibt in Form.Icon in diesem Fall zwar eine TIcon-Instanz, aber innerhalb Dieser ist kein Icon (MSDN-Library durchsuchenHICON) enthalten. :shock:

In meinem Fall konnte ich dieses Problem also nun so lösen:
Delphi-Quellcode:
procedure TInsightAction.AssignImage(Value: TGraphic);
begin
  if (Value is TIcon) and (TIcon(Value).Handle = 0) then
    Value := nil;
  ...

SirThornberry 5. Mai 2010 10:06

Re: Wie TIcon gestretcht in ein TBitmap zeichnen?
 
Genau so ist es (zumindest war es bei Delphiversionen die ich kenne). Man sieht zwar das Icon beim Form auch wenn keines direkt dem Form zugeweisen ist, aber das hängt damit zusammen das beim erzeugen wohl geprüft wird ob ein spezielles Icon zugewiesen wurde, und wenn dem nicht der Fall ist wird das Iconhandle des Applicationobjektes verwendet.

himitsu 5. Mai 2010 10:15

Re: Wie TIcon gestretcht in ein TBitmap zeichnen?
 
Es wäre dann aber besser gewesen, erst garkeine Icon-Instanz zu erzeugen.
Der "übliche" Weg ala Assigned(Form.Icon) ist ja dadurch leider nicht möglich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz