Beispiel 4 — Quadrat mit Loch (Combine)

Erstellt: 2026-05-27 · Aktualisiert: 2026-05-27

Advanced Snippet Editor

Ein Kreis wird aus einem Quadrat ausgestanzt — Combine erzeugt das Loch. Das Ergebnis ist eine Form mit einem echten Durchbruch, die auch über Hintergründe hinweg transparent erscheint.


Ergebnis


Code

/* PARAMS */
float left  = 120f;
float top   = 100f;
float size  = 180f;
var   color = System.Drawing.Color.FromArgb(39, 174, 96);
/* END PARAMS */

int fillRgb = System.Drawing.ColorTranslator.ToOle(color);
int lineRgb = System.Drawing.ColorTranslator.ToOle(
    System.Drawing.Color.FromArgb(27, 120, 67));
float cx   = left + size / 2f;
float cy   = top  + size / 2f;
float hole = size * 0.35f;

// Quadrat
var oSquare = ppptools.AddRect(left, top, size, size);

// Loch-Kreis (zentriert im Quadrat)
var oHole = ppptools.AddOval(cx - hole/2f, cy - hole/2f, hole, hole);

// Combine — Kreis wird aus dem Quadrat ausgestanzt
oSquare.Select(MsoTriState.msoTrue);
oHole.Select(MsoTriState.msoFalse);
ppptools.Combine();

foreach (dynamic sh in ppptools.GetSelectedRange())
{
    sh.Name               = "SquareWithHole";
    sh.Fill.ForeColor.RGB = fillRgb;
    sh.Fill.Transparency  = 0f;
    sh.Line.ForeColor.RGB = lineRgb;
    sh.Line.Weight        = 1.5f;
}

Schritt-für-Schritt-Erklärung

1. Farben und Grössen vorbereiten

int fillRgb = System.Drawing.ColorTranslator.ToOle(color);
int lineRgb = System.Drawing.ColorTranslator.ToOle(
    System.Drawing.Color.FromArgb(27, 120, 67));
float cx   = left + size / 2f;
float cy   = top  + size / 2f;
float hole = size * 0.35f;

Alle berechneten Werte werden vor der Form-Erstellung als lokale Variablen gespeichert. Das ist sauberer als die Berechnungen direkt in den Methodenaufrufen zu verschachteln.

  • cx / cy — Mittelpunkt des Quadrats (für die Loch-Zentrierung)
  • hole = size * 0.35f — Loch-Durchmesser = 35 % der Quadrat-Grösse

2. Quadrat erstellen

var oSquare = ppptools.AddRect(left, top, size, size);

width == height → perfektes Quadrat (genau wie beim Kreis mit msoShapeOval).

3. Loch-Kreis erstellen und zentrieren

var oHole = ppptools.AddOval(cx - hole/2f, cy - hole/2f, hole, hole);

Der Loch-Kreis liegt exakt im Mittelpunkt des Quadrats. Das Mittelpunkt-Muster aus Beispiel 2 wird wieder verwendet: cx - hole/2f.

4. Combine-Operation — der Unterschied zu Union

oSquare.Select(MsoTriState.msoTrue);
oHole.Select(MsoTriState.msoFalse);
ppptools.Combine();

Combine funktioniert wie Union, aber: Bereiche, wo sich Formen überschneiden, werden ausgestanzt (werden transparent). Das Ergebnis ist eine Form mit einem echten Loch.

Operation Überschneidung
Union bleibt gefüllt
Combine wird zum Loch (transparent)
Intersect nur Überschneidung bleibt
Subtract Überschneidung wird von erster Form abgezogen

Reihenfolge beim Selektieren

Bei Combine spielt die Selektionsreihenfolge eine Rolle für den Stil:
Die zuerst selektierte Form (msoTrue) gibt Farbe und Formatierung vor.
Beide Formen werden ausgestanzt — aber die erste Form „gewinnt" beim Stil.

5. Ergebnis-Form formatieren

foreach (dynamic sh in ppptools.GetSelectedRange())
{
    sh.Name               = "SquareWithHole";
    sh.Fill.ForeColor.RGB = fillRgb;
    sh.Fill.Transparency  = 0f;
    sh.Line.ForeColor.RGB = lineRgb;
    sh.Line.Weight        = 1.5f;
}

Das Loch ist nicht sichtbar, solange der Folienhintergrund weiss ist. Über einem farbigen Hintergrund oder Bild sieht man den echten Durchbruch.


Besonderheiten dieses Beispiels

  • Combine ≠ Union — gleiche Syntax, aber überlappende Bereiche werden Löcher, nicht Fläche.
  • Echtes Loch — nicht nur optisch (mit weissem Kreis überdeckt), sondern ein echter geometrischer Durchbruch in der Form. Prüfbar: Folienhintergrund ändern → Loch zeigt den Hintergrund.
  • lineRgb direkt definiert — die dunklere Rahmenfarbe (27, 120, 67) passt farblich zur Füllfarbe (39, 174, 96) als abgedunkelter Ton.
  • Line.Weight = 1.5f — dünner Rahmen, der die Loch-Kontur sichtbar macht.

Zurück: Beispiel 3 — Union · Weiter: Beispiel 5 — Zahnrad