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