![]() |
Bild im Popupmenu
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Ich möchte in meinem Programm ein richtiges Bild in ein Popupmenu einbauen, ich habs schon im menu drin nur es ist extrem verpixelt. Daher wollte ich fragen ob es ich etwas machen kann dass es nichtmehr so verpixelt ist. Hier der ausschnitt in dem ich das Bild ins Menu einfüge (glaube ich, hab mir die Canvas sachen noch nicht angeschaut)
Delphi-Quellcode:
Das Bild lade ich aus dem Internet in nen Stream und von dort in das TImage (umständlich aber mir is gestern abend nich besseres eingefallen).
procedure TForm1.pupImageAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState); begin try InflateRect(ARect,-5,-5) ; ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ; finally end; end;
Delphi-Quellcode:
Das Codeschnippselchen hab ich aus dem Forum hier ^^
LDestStream := TMemoryStream.Create;
... LJpg := TJPEGImage.Create; LJpg.LoadFromStream(LDestStream); image1.Picture.Assign(Ljpg); Also wie bekomme ich es hin dass mein Bild nichtmehr so verpixelt ist? Ein Bild des Problems ist angehängt. mfg D0N |
Re: Bild im Popupmenu
Das sieht so aus, als ob die Proportionen nicht stimmen. Außerdem bekommt man mit SetStretchBltMode auf HALFTONE meist recht gute Ergebnisse (Wunder kann man natürlich nicht erwarten). Vielleicht hilft Dir dieser Beitrag ein wenig weiter:
![]() |
Re: Bild im Popupmenu
Wie benutze ich denn SetStretchBltMode habs zwar mal eingebunden
Delphi-Quellcode:
Bekomme aber ne Exception "Ein Bild kann nur geändert werden, wenn es einen Bitmap enthält".
procedure TForm1.pupImageAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState); begin try //InflateRect(ARect,-5,-5) ; SetStretchBltMode(ACanvas.Handle, STRETCH_HALFTONE); SetBrushOrgEx(ACanvas.Handle, 0, 0, nil); //ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ; StretchBlt(ACanvas.Handle,0,0,Image1.Picture.Width,Image1.Picture.Height,Image1.Canvas.Handle,0,0, Image1.Picture.Width,Image1.Picture.Height,SRCCOPY); finally end; end; Wie schon erwähnt hab ich oben den Text zusammengeknaupt weil ich nicht weiß die Canvas funktioniert. |
Re: Bild im Popupmenu
Ich an Deiner Stelle würde einfach die verlinkte Prozedur verwenden und die gestretchte JPEG dann in das Image laden, das sollte das Einfachste sein.
|
Re: Bild im Popupmenu
Dann ist es doch trotzdem so Verpixelt da ich es ja immernoch mit
Delphi-Quellcode:
ins Popupmenu einfüge. Das Bild sollte ja nur ne Zwischenablage zwischen Stream und Popupmenu sein.
ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ;
Nur kurz zur Klärung Ablauf:
und dann isses eben so verpixelt auch wenn ich vorher die Procedure verwendet habe und das Jpg dem Image zugewiesen habe ( Assign ). mfg |
Re: Bild im Popupmenu
Achso, dann musst Du dem Rect dann schon die Maße des (gestretchten) Bildes zuweisen.
Delphi-Quellcode:
Zumindest so in etwa müsste das funktionieren.
procedure TForm1.pupImageAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState); begin ARect.Bottom := ARect.Top + Image1.Picture.Height; ARect.Right := ARect.Left + Image1.Picture.Width; ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ; end; |
Re: Bild im Popupmenu
klappt thx sieht gut aus.
Noch was nebenbei wenn nicht is auch nicht schlimm. Gibt es ne möglichkeit das Bild zu zentrieren bzw was muss ich dafür ändern? |
Re: Bild im Popupmenu
Die Breite des Rects ergibt sich ja aus Right - Left. Demzufolge wäre die Mitte (Right - Left) div 2. Davon ziehst Du nun noch die halbe Bildbreite ab. Das ist dann die linke Seite. Äquivalent geht das mit der Höhe.
[edit] Mal aus dem Kopf getippt, ich hoffe, das stimmt so:
Delphi-Quellcode:
[/edit]
procedure TForm1.pupImageAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState); begin ARect.Left := ARect.Left + (ARect.Right - ARect.Left) div 2 - Image1.Picture.Width div 2; ARect.Right := ARect.Left + Image1.Picture.Width; ARect.Top := ARect.Top + (ARect.Bottom - ARect.Top) div 2 - Image1.Picture.Height div 2; ARect.Bottom := ARect.Top + Image1.Picture.Height; ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ; end; |
Re: Bild im Popupmenu
ui sieht Super aus.
Das war atm alles danke für deine Mühe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz