Helper Example: Post-it

Created: 2026-05-29 · Updated: 2026-05-29

Helper Reference · Advanced Snippet Editor

Parameterized Post-it with selectable size, color, and optional drop shadow. Demonstrates Freeform, Duplicate, Flip, Z-Order, Gradient, and Group.


ppptools Methods Used

Method Purpose
ppptools.BuildFreeform(editingType, x, y) Post-it body as a parallelogram
ppptools.AddRect(x, y, w, h) Clipping mask for Intersect
ppptools.Intersect() Post-it base with clean edge
ppptools.Subtract() Cut folded corner
ppptools.GetSelected() Retrieve result shape after Boolean op
ppptools.Duplicate(shape) Create shadow duplicate
ppptools.FlipH(shape) Flip shadow horizontally
ppptools.SetGradient(...) Shadow gradient fill
ppptools.HideLine(shape) Hide shadow outline
ppptools.SendBackward(shape) Push shadow behind Post-it
ppptools.Group(shape1, shape2) Group Post-it and shadow
ppptools.SlideWidth / SlideHeight Center on slide

Parameters

@param Type Default Description
Groesse enum "Mittel" Small (75%), Medium (100%), Large (150%)
Farbe color #FFD966 Post-it background color
Schatten bool true Show drop shadow
Zentrieren bool true Center on slide

Result


Full Code

// @help https://ppptools.happy-pc.ch/help/en/helper-example-postit
// @param enum   Groesse    "Size"                 options="Klein|Mittel|Gross"  default="Mittel"
// @param color  Farbe      "Color"                default=#FFD966
// @param bool   Schatten   "Show shadow"          default=true
// @param bool   Zentrieren "Center on slide"      default=true

string groesse    = Params.GetString("Groesse",   "Mittel");
var    farbe      = Params.GetColor("Farbe",      Color.FromArgb(255, 217, 102));
bool   schatten   = Params.GetBool("Schatten",   true);
bool   zentrieren = Params.GetBool("Zentrieren", true);

int farbeRgb = System.Drawing.ColorTranslator.ToOle(farbe);

float bx = 100f, by = 100f, bw = 100f, bh = 100f, pi = 20f;

// ── Step 1: Freeform (parallelogram) ──────────────────────────────────
var ffb = ppptools.BuildFreeform(MsoEditingType.msoEditingCorner, bx, by);
ffb.AddNodes(MsoSegmentType.msoSegmentLine,  MsoEditingType.msoEditingCorner, bx + bw,      by);
ffb.AddNodes(MsoSegmentType.msoSegmentLine,  MsoEditingType.msoEditingCorner, bx + bw + pi, by + bh);
ffb.AddNodes(MsoSegmentType.msoSegmentLine,  MsoEditingType.msoEditingCorner, bx + pi,      by + bh);
ffb.AddNodes(MsoSegmentType.msoSegmentCurve, MsoEditingType.msoEditingCorner, bx, by + 130f, bx, by);
var oFreeform = ffb.ConvertToShape();
oFreeform.Name = "PostIt_Freeform";

var oRect = ppptools.AddRect(bx, by, bw + pi, bh);
oRect.Name = "PostIt_Rect";

// ── Step 2: Intersect → clean Post-it base ────────────────────────────
oFreeform.Select(MsoTriState.msoTrue);
oRect.Select(MsoTriState.msoFalse);
ppptools.Intersect();
dynamic oBase = ppptools.GetSelected();

// ── Step 3: Subtract → cut folded corner ──────────────────────────────
dynamic oCut = ppptools.Duplicate(oBase);
oCut.Left = (float)oBase.Left + bw;
oCut.Top  = (float)oBase.Top;
oBase.Select(MsoTriState.msoTrue);
oCut.Select(MsoTriState.msoFalse);
ppptools.Subtract();
dynamic oPostIt = ppptools.GetSelected();

// ── Post-it formatting ────────────────────────────────────────────────
oPostIt.Fill.ForeColor.RGB  = farbeRgb;
oPostIt.Fill.Transparency   = 0f;
oPostIt.Line.Weight         = 2f;
oPostIt.Line.ForeColor.RGB  = 16777215;
oPostIt.Line.Transparency   = 0f;
oPostIt.Line.DashStyle      = MsoLineDashStyle.msoLineSolid;
oPostIt.Line.Style          = MsoLineStyle.msoLineSingle;
oPostIt.Name = "PostIt";

oPostIt.TextFrame.TextRange.ParagraphFormat.Alignment         = PpParagraphAlignment.ppAlignCenter;
oPostIt.TextFrame.TextRange.ParagraphFormat.BaseLineAlignment = PpBaselineAlignment.ppBaselineAlignCenter;
oPostIt.TextFrame2.VerticalAnchor  = MsoVerticalAnchor.msoAnchorMiddle;
oPostIt.TextFrame.VerticalAnchor   = MsoVerticalAnchor.msoAnchorMiddle;
oPostIt.TextFrame2.Orientation     = MsoTextOrientation.msoTextOrientationHorizontal;
oPostIt.TextFrame2.MarginTop    = 3.6f;
oPostIt.TextFrame2.MarginRight  = 7.2f;
oPostIt.TextFrame2.MarginBottom = 3.6f;
oPostIt.TextFrame2.MarginLeft   = 7.2f;
oPostIt.TextFrame.WordWrap      = MsoTriState.msoTrue;
oPostIt.TextFrame2.Column.Number  = 1;
oPostIt.TextFrame2.Column.Spacing = 0;
oPostIt.TextFrame2.AutoSize = MsoAutoSize.msoAutoSizeTextToFitShape;
oPostIt.TextFrame.TextRange.Font.Name  = "Arial";
oPostIt.TextFrame.TextRange.Font.Size  = 12;
oPostIt.TextFrame.TextRange.Font.Bold  = MsoTriState.msoFalse;
oPostIt.TextFrame.TextRange.Font.Color.RGB =
    System.Drawing.ColorTranslator.ToOle(Color.FromArgb(38, 38, 38));
oPostIt.TextFrame2.TextRange.Font.Fill.Solid();

// ── Step 4: Shadow ────────────────────────────────────────────────────
dynamic oShadow = null;
if (schatten)
{
    oShadow = ppptools.Duplicate(oPostIt);
    oShadow.Name = "PostIt_Shadow";
    ppptools.FlipH(oShadow);
    oShadow.Top    = (float)oPostIt.Top;
    oShadow.Left   = (float)oPostIt.Left - 10f;
    oShadow.Height = (float)oShadow.Height + 15f;
    ppptools.SetGradient(oShadow, Color.FromArgb(38, 38, 38), Color.FromArgb(241, 241, 241));
    ppptools.HideLine(oShadow);
    ppptools.SendBackward(oShadow);
}

// ── Step 5: Group ─────────────────────────────────────────────────────
dynamic oGroup = oShadow != null
    ? ppptools.Group(oPostIt, oShadow)
    : ppptools.Group(oPostIt);
oGroup.Name = "PostIt_Group";

// ── Scale ─────────────────────────────────────────────────────────────
float scale = groesse == "Klein" ? 0.75f : groesse == "Gross" ? 1.5f : 1.0f;
oGroup.Width  = (float)oGroup.Width  * scale;
oGroup.Height = (float)oGroup.Height * scale;

// ── Center ────────────────────────────────────────────────────────────
if (zentrieren)
{
    oGroup.Left = (ppptools.SlideWidth  - (float)oGroup.Width)  / 2f;
    oGroup.Top  = (ppptools.SlideHeight - (float)oGroup.Height) / 2f;
}

Step by Step

1. Freeform with ppptools.BuildFreeform

BuildFreeform returns a FreeformBuilder. Call .AddNodes(...) to add points, then .ConvertToShape() to finish. Here it creates a parallelogram with a slanted side edge — the characteristic Post-it shape.

2. Clipping mask with ppptools.AddRect + Intersect

The rectangle clips the slanted parallelogram to rectangular bounds — the left side becomes straight. ppptools.GetSelected() retrieves the result after Intersect.

3. Folded corner with ppptools.Duplicate + Subtract

dynamic oCut = ppptools.Duplicate(oBase);   // returns shape directly (no [1] index)
oCut.Left = (float)oBase.Left + bw;       // offset to overlap only top-right corner
ppptools.Subtract();

ppptools.Duplicate returns the new shape directly — no [1] index needed. The copy is shifted right by bw, so it only overlaps the top-right corner. Subtract removes that corner → the classic folded Post-it corner.

4. Shadow with ppptools.FlipH, SetGradient, HideLine, SendBackward

oShadow = ppptools.Duplicate(oPostIt);
ppptools.FlipH(oShadow);                             // mirror horizontally
ppptools.SetGradient(oShadow,
    Color.FromArgb(38, 38, 38),                    // dark at top
    Color.FromArgb(241, 241, 241));                // light at bottom
ppptools.HideLine(oShadow);
ppptools.SendBackward(oShadow);                      // behind Post-it

ppptools.SetGradient sets a 2-color gradient in a single call (default angle 90°).

5. Group with ppptools.Group

dynamic oGroup = oShadow != null
    ? ppptools.Group(oPostIt, oShadow)
    : ppptools.Group(oPostIt);

ppptools.Group(shape1, shape2, ...) selects all given shapes and groups them. No manual .Select() calls needed.


Back: Helper Reference · All Examples