Kleine Dinge die ewig brauchen: CustomEndCaps bei GDI+ Pens


Thomas Wölfer
Thomas Wölfer

24. Oktober 2005


Ich mache das eigentlich lange genug, aber es passiert mir immer noch das ich mich davon überraschen lasse, wie unglaublich viel Zeit für die kleinsten Kleinigkeiten beim programmieren anfallen können. Letztes Beispiel: Das zeichnen von Pfeilen.

Das ist eigentlich kein Problem: GDI+ kann das von Haus aus, und die Funktionalität ist bei .Net in der "Pen" Klasse gekapselt. Ein "Pen" ist im Kern eine Zusammenfassung aus einer Farbe und einer Strichstärke mit optionalen "besonderen" Enden. Malt man einen Strich mit einem Pen, dann wird im Normalfall genau das ausgegeben: Ein Strich. Nun kann man aber weitere Eigenschaften des Pen einstellen: Die StartCaps und EndCaps. So kann man beispielsweise LineCap.ArrowAnchor verwenden - und erhält dann einen hübschen Pfeil.

Dummerweise brauchen wir nicht nur einfache Pfeile: Für Momente gibt es ja das Symbol mit der doppelten Pfeilspitze, und es ist wenig überraschend, das GDI+ nicht besonders viel über Momente weiss. Ergo: Kein LineCap für Doppelpfeile. Dafür gibt es aber eine andere Eigenschaft: Die CustomLinCap. Der Trick dabei: Man kann selbst festlegen, wie das Ende der Linie aussehen soll.

Das ist schön, nur ist die Dokumentation dazu ein wenig mau. Es gibt zwar ein Beispielprogramm, aber das ist, sehr vorsichtig ausgedrückt, nur wenig hilfreich. Um herauszufinden wie das nun eigentlich wirlich funktioniert, muss man allen ernstes ein paar Stunden investieren. Nur für einen blöden Pfeil.

Wie auch immer, die Sache funktioniert so: Die per Pen ausgegebenen Striche haben ja eine Strichstärke, darum gibt es zwei Möglichkeiten die Form des Strichendes zu definieren: Entweder mit einem Outline das in der Mitte des Striches anfängt, oder mit einem Outline das links oder rechts am Rand des Striches beginnt. Darum haben die CustomLineCaps auch diesen merkwürdigen Konstruktor mit zwei Parametern, von denen der eine immer null sein muss. Übergibt man den Path im ersten Parameter, beginnt das Outline eben am Rand des Striches, sonst in der Mitte.

Was die Dokumentation leider nicht sagt - und das ist es, was dann hinterher die Zeit kostet: Gibt man eine Form an die am Rand beginnen soll, dann wird diese an beiden Rändern ausgegeben. Und zwar nicht gespiegelt, sondern im Original. Damit bekommt man also Mickey-Mouse Ohren hin, aber eben keine vernünftigen Pfeilspitzen. Man muss also die andere Methode verwenden. Und: Das Outline darf sich nicht selbst schneiden - sonst klappt die Sache mit dem Füllen nicht. Resultat: Man sieht nichts.

Und noch ein letzter Tipp: Wenn Sie dabei sind die CustomLineCaps auszuprobieren: Machen Sie das mit einem dicken Strich - nur so bekommt man wirklich heraus, was genau eigentlich gemalt wird.