Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zeichnen eines Rasters mit dem GDI+ (https://www.delphipraxis.net/153723-zeichnen-eines-rasters-mit-dem-gdi.html)

McDoT 13. Aug 2010 15:51

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:
// 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 hab halt das Gefühl, das DrawLine extrem langsam ist... Oder ich benutze es falsch^^

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

McDoT 15. Aug 2010 08:59

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

Florian Hämmerle 15. Aug 2010 15:52

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