Einzelnen Beitrag anzeigen

McDoT

Registriert seit: 29. Mär 2010
3 Beiträge
 
Delphi 7 Professional
 
#1

Zeichnen eines Rasters mit dem GDI+

  Alt 13. Aug 2010, 16:51
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

Ich habe als Ergebnis ein Visio-ähnliches Raster angestrebt und freue mich natürlich über jeden Vorschlag und Denkanstoß

MfG McDoT

Geändert von McDoT (13. Aug 2010 um 16:54 Uhr)
  Mit Zitat antworten Zitat