![]() |
Zeichnen eines Rasters mit dem GDI+
Hallo an alle,
hat jemand von euch ne Idee, wie man am performantesten mit der GDI+ API von Progdigy ein Raster auf ein TGPBitmap zeichnen kann? Momentan zeichne ich alles in zwei Schleifen, jeweils eine für die Horizontalen Linien und eine für die Vertikalen Linien. Wenn sich das Raster nicht ändern würde, wäre die Sache ja geklärt. Dann müsste ich es ja nur einmal zeichnen oder ich würde ein gespeichertes Bitmap laden oder so... Nur leider soll sich das Raster je nach Zoomfaktor und Position der Zeichenfäche ändern. Code:
Delphi-Quellcode:
Ich hab halt das Gefühl, das DrawLine extrem langsam ist... Oder ich benutze es falsch^^
// FWidth und FHeight sind Propertys von TWorkspace
procedure TWorkSpace.DrawWorkSpace; var LGraphics: TGPGraphics; LBGraphics: TGPGraphics; LBitmap: TGPBitmap; LCBitmap: TGPCachedBitmap; begin LBitmap := TGPBitmap.Create(FWidth, FHeight); LGraphics := TGPGraphics.Create(LBitmap); try // Hintergrund ausfüllen bzw. alten Inhalt löschen LGraphics.Clear(MakeColor(255, 255, 255, 255)); // hier soll später am anfang das Raster bzw. Grid gezeichnet werden DrawGrid(LGraphics); LBGraphics := TGPGraphics.Create(FDC); LCBitmap := TGPCachedBitmap.Create(LBitmap, LBGraphics); try LBGraphics.DrawCachedBitmap(LCBitmap, 0, 0); finally FreeAndNil(LCBitmap); FreeAndNil(LBGraphics); end; finally FreeAndNil(LGraphics); FreeAndNil(LBitmap); end; end; // Grid zeichnen procedure TWorkSpace.DrawGrid(AGraphics: TGPGraphics); var LPen: TGPPen; LLinesHori, LLinesVerti, LCount, LLineDistance: Integer; begin LPen := TGPPen.Create(MakeColor(255, 128, 128, 128)); try // Hier müsste ich noch je nach Zoomfaktor den Abstand berechnen, // aber ein Fester Wert tuts zum testen auch LPen.SetDashStyle(DashStyleDash); LLineDistance := 20; LLinesHori := FWidth div LLineDistance; LLinesVerti := FHeight div LLineDistance; for LCount := 0 to LLinesHori - 1 do begin // eine horizontale Linie zeichnen AGraphics.DrawLine(LPen, (LLineDistance * LCount), 0, ( LLineDistance * LCount), FWidth); end; for LCount := 0 to LLinesVerti - 1 do begin // eine vertikale Linie zeichnen AGraphics.DrawLine(LPen, 0, (LLineDistance * LCount), FWidth, (LLineDistance * LCount)); end; finally if Assigned(LPen) then FreeAndNil(LPen); end; end; Ich hoffe das ist nicht zu viel Code... Einer meiner ersten Posts hier :stupid: Ich habe als Ergebnis ein Visio-ähnliches Raster angestrebt und freue mich natürlich über jeden Vorschlag und Denkanstoß :) MfG McDoT |
AW: Zeichnen eines Rasters mit dem GDI+
Niemand eine Idee? Oder war es ein Fehler GDI+ und performant in einem Post zu nennen?^^
MfG McDoT |
AW: Zeichnen eines Rasters mit dem GDI+
Naja, es heißt das GDI+ den Zeichenroutinen von Canvas noch etwas hinterherhinkt, was die Geschwindigkeit angeht.
mfg Florian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 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