Forums Neueste Beiträge
 

System.Drawing.Graphics nicht vererbar

26/02/2010 - 12:26 von Christian Thiele | Report spam
Hallo,

wie der Titel schon angibt, geht es um die Nichtvererbbarkeit der
Graphics-Klasse. Zum einen würde mich interessieren, wieso das so ist und
zum anderen bitte ich um Kommentare, wie ich ein erwünschtes Verhalten
trotzdem am elegantesten lösen kann.

Ich habe eine Funktion Draw(Graphics g), die komplexe Zeichenoperationen
durchführt, im Normalfall getriggert durch Control.Paint und aufgerufen
mit der Graphics-Instanz aus den PaintEventArgs. Es ist aber auch sehr
leicht, die Ausgabe z.B. in eine PNG-Datei zu schreiben, indem man die
gleiche Funktion aufruft, aber ein neues Bild erstellt und mittels
Graphics.FromImage() die Graphics-Instanz ermittelt. Zusàtzlich würde ich
nun gerne eine SVG-Ausgabe erstellen. Da die vorhandenen SVG-Bibliotheken
mir nicht zusagen und SVG ja ein sehr einfaches Format ist, erstelle ich
das SVG selbst. Idealerweise hàtte ich mir eine Klasse SvgGraphics
erstellt, die sich von Graphics ableitet und alle wichtigen Funktionen
(DrawRectangle, DrawLine...) implementiert. Dann hàtte ich meine normale
Draw-Funktion aufrufen können und hàtte eine SVG-Ausgabe gehabt.

Jetzt sieht es derzeit so aus, dass ich die Draw-Funktion gedoppelt habe
(einmal für Graphics und einmal für SvgGraphics) und sich diese Routinen
fast gleichen (für SVG habe ich noch Sachen wie DrawRoundedRectangle etc.
ergànzt, die ich sonst auch in einer ExtendedGraphics-Klasse eingebaut
hàtte). Sicherlich ist das keine dauerhafte Lösung. Wieso also làsst sich
Graphics nicht vererben und wie löse ich das Problem?

Danke im Voraus,
Christian Thiele
 

Lesen sie die antworten

#1 Immo Landwerth
26/02/2010 - 12:48 | Warnen spam
Christian Thiele wrote:

Jetzt sieht es derzeit so aus, dass ich die Draw-Funktion gedoppelt habe
(einmal für Graphics und einmal für SvgGraphics) und sich diese Routinen
fast gleichen (für SVG habe ich noch Sachen wie DrawRoundedRectangle
etc. ergànzt, die ich sonst auch in einer ExtendedGraphics-Klasse
eingebaut hàtte). Sicherlich ist das keine dauerhafte Lösung. Wieso also
làsst sich Graphics nicht vererben und wie löse ich das Problem?



Weil eine Graphics Objekt an einen GDI Device Context gebunden ist
(HDC). Die Tatsache, dass man mit einem Graphics Objekt sowohl Bitmaps,
EMFs wie auch den Bildschirm benutzen kann, ist ein natives Windows GDI
Feature und wird daher nicht durch vererben und andere Implementierung
von Graphics Methoden erreicht.

Du kannst das ganze über Interfaces und Delegation erreichen:

interface IDrawingContext
{
void DrawLine();
/* Andere Methoden */
}

public class GraphicsDrawingContext : IDrawingContext
{
private Graphics _g;

public GraphicsDrawingContext (Graphics g)
{
_g = g;
}

public DrawLine(...)
{
_g.DrawLine(...);
}

/* Analog für andere Methoden */
}

public class SvgDrawingContext : IDrawingContext
{
public DrawLine(...)
{
// XML Erstellen, dass eine Linie in SVG repràsentiert.
}
}

Anschließend musst Du natürlich Deinen Drawing Code gegen Dein eigenes
Interface IDrawingContext implementieren (statt gegen die .NET Graphics
Klasse).

Immo Landwerth

Ähnliche fragen