Example: Arrow with Adjustments

Created: 2026-05-31 · Updated: 2026-05-31

PPPTools Reference

This example shows how to create block arrows and fine-tune them via the Adjustments collection — shaft width, arrowhead size, and other geometric parameters.


What are Adjustments?

Most AutoShapes have one or more adjustment handles — in PowerPoint these appear as small yellow squares when you select a shape. They let you modify the shape's geometry by dragging, without needing to edit individual vertices.

In code these handles are accessible via oShape.Adjustments[n] (1-based).

dynamic oArrow = ppptools.AddShape(MsoAutoShapeType.msoShapeRightArrow, 100, 150, 250, 100);

// Read adjustment count
int count = (int)oArrow.Adjustments.Count;  // → 2 for RightArrow

// Read and set a value
float val1 = (float)oArrow.Adjustments[1];  // current value
oArrow.Adjustments[1] = 0.7f;               // set new value

Values are typically normalized (0.01.0), but the exact meaning differs per shape. Microsoft does not document per-shape adjustment values; the most reliable method is the Macro Recorder or experimental testing.

Maximum number of adjustments

A shape can have up to 8 adjustments. Source: Microsoft Docs — Adjustments object


Adjustment Categories

PowerPoint shapes with adjustments fall into a few families — handles within the same family behave similarly:

Basic Geometric Shapes

Shapes like Rounded Rectangle, Donut, Hexagon, and Diamond typically have 1 adjustment:

Shape family What the handle controls
Rounded Rectangle Corner radius — drag inward/outward to increase or decrease rounding
Donut (Ring) Inner ring thickness — controls how wide or narrow the ring channel is
Hexagon Shifts vertices — from a regular hexagon toward a rectangle or diamond
Zigzag / Wave Depth of the zigzag or wave amplitude

Block Arrows and Chevrons

This family often has 2 handles: one for the shaft, one for the arrowhead.

Shape family [1] [2]
Simple block arrows (Right/Left/Up/Down) Where the arrowhead begins Shaft width
U-turn / split arrows Shaft width Neck length
Chevron Notch depth

Stars and Banners

Stars (5-point, 6-point, etc.) have 1 adjustment: the inner radius. - Drag handle inward → points become sharper and longer (slender star) - Drag handle outward → points become shorter, shape resembles a badge or circle

Banners and scrolls control the depth and angle of folds, curls, or ribbons.

Callouts (Speech Bubbles)

Rectangle, oval, and cloud callouts typically have 2–4 adjustments for the tail length and position. Values can exceed 0–1 (e.g., 1.3 = tail extends beyond the shape boundary).

Smiley and Action Buttons

  • Smiley Face: 1 adjustment controls the curve — from smile to straight line to frown
  • Action Buttons (house, clock, etc.): scale adjustments for icon-specific proportions

Multiple handles are possible

Some shapes (e.g., circular arrow msoShapeCircularArrow) have up to 5 adjustments — for example start and end angle, shaft width, arrowhead size. Use the Macro Recorder to discover all handles for a specific shape.


Block Arrow Right (msoShapeRightArrow)

The RightArrow has 2 adjustments:

Index Controls Range Meaning
[1] Where the arrowhead begins (horizontal) 0.0–1.0 smaller = wider arrowhead
[2] Shaft height (vertical) 0.0–0.5 smaller = thicker shaft
// Default arrow
dynamic oDefault = ppptools.AddShape(MsoAutoShapeType.msoShapeRightArrow, 50, 50, 250, 80);
ppptools.SetFill(oDefault, Color.FromArgb(68, 114, 196));
ppptools.HideLine(oDefault);

// Slim arrow: narrow shaft, small arrowhead
dynamic oSlim = ppptools.AddShape(MsoAutoShapeType.msoShapeRightArrow, 50, 160, 250, 80);
oSlim.Adjustments[1] = 0.75f;  // arrowhead starts at 75 % of length
oSlim.Adjustments[2] = 0.15f;  // shaft = 15 % of total height
ppptools.SetFill(oSlim, Color.FromArgb(112, 173, 71));
ppptools.HideLine(oSlim);

// Bold arrow: thick shaft, large arrowhead
dynamic oBold = ppptools.AddShape(MsoAutoShapeType.msoShapeRightArrow, 50, 270, 250, 80);
oBold.Adjustments[1] = 0.5f;   // arrowhead at 50 % of length
oBold.Adjustments[2] = 0.4f;   // shaft = 40 % of total height
ppptools.SetFill(oBold, Color.FromArgb(255, 102, 0));
ppptools.HideLine(oBold);

Chevron (msoShapeChevron)

The Chevron has 1 adjustment:

Index Controls Range Meaning
[1] Notch depth (horizontal cutout) 0.0–1.0 0 = no notch (rectangle), 1 = pointed arrow
// Process steps as chevron chain
string[] labels = { "Analysis", "Design", "Build", "Test" };
Color[] colors  = {
    Color.FromArgb(68,  114, 196),
    Color.FromArgb(112, 173,  71),
    Color.FromArgb(255, 192,   0),
    Color.FromArgb(255, 102,   0)
};

for (int i = 0; i < labels.Length; i++)
{
    float x = 40f + i * 160f;
    dynamic oCh = ppptools.AddShape(MsoAutoShapeType.msoShapeChevron, x, 200, 175, 70);
    oCh.Adjustments[1] = 0.5f;  // medium notch depth
    ppptools.SetFill(oCh, colors[i]);
    ppptools.HideLine(oCh);
    ppptools.SetText(oCh, labels[i], fontSize: 11f, color: Color.White, bold: true,
        align: PowerPoint.PpParagraphAlignment.ppAlignCenter);
}

Pentagon Arrow (msoShapePentagon)

Pentagon has 1 adjustment (depth of the right point):

dynamic oPent = ppptools.AddShape(MsoAutoShapeType.msoShapePentagon, 100, 100, 180, 70);
oPent.Adjustments[1] = 0.5f;  // default: medium point
ppptools.SetFill(oPent, Color.FromArgb(68, 114, 196));
ppptools.HideLine(oPent);

Rounded Rectangle (msoShapeRoundedRectangle)

1 adjustment: corner radius.

Index Controls Range Meaning
[1] Corner radius 0.0–0.5 0 = sharp corners, 0.5 = maximum rounding (ellipse)
// Lightly rounded card
dynamic oCard = ppptools.AddShape(MsoAutoShapeType.msoShapeRoundedRectangle, 100, 100, 200, 100);
oCard.Adjustments[1] = 0.05f;  // subtle rounding
ppptools.SetFill(oCard, Color.FromArgb(240, 240, 240));
ppptools.SetLine(oCard, Color.FromArgb(180, 180, 180), 1f);

// Fully rounded pill shape
dynamic oPill = ppptools.AddShape(MsoAutoShapeType.msoShapeRoundedRectangle, 100, 230, 200, 60);
oPill.Adjustments[1] = 0.5f;  // maximum rounding
ppptools.SetFill(oPill, Color.FromArgb(68, 114, 196));
ppptools.HideLine(oPill);
ppptools.SetText(oPill, "Button", color: Color.White, bold: true,
    align: PowerPoint.PpParagraphAlignment.ppAlignCenter);

Callout with Adjustment (msoShapeRectangularCallout)

Callouts have 2 adjustments for the pointer position:

Index Controls
[1] Horizontal position of pointer (relative to box width)
[2] Vertical position of pointer (relative to box height)
dynamic oCallout = ppptools.AddShape(
    MsoAutoShapeType.msoShapeRectangularCallout, 100, 100, 200, 100);
oCallout.Adjustments[1] = 1.3f;   // pointer to the right outside
oCallout.Adjustments[2] = 1.5f;   // pointer below the box
ppptools.SetFill(oCallout, Color.FromArgb(255, 242, 204));
ppptools.SetLine(oCallout, Color.FromArgb(200, 160, 0), 1.5f);
ppptools.SetText(oCallout, "Note!", fontSize: 11f,
    color: Color.FromArgb(100, 60, 0));

Adjustment Reference: Most Common Shapes

Shape Enum Adj count [1] [2]
Block arrow right msoShapeRightArrow 2 Arrowhead start (0–1) Shaft height (0–0.5)
Block arrow left msoShapeLeftArrow 2 Same as RightArrow Same as RightArrow
Block arrow up msoShapeUpArrow 2 Shaft width (0–0.5) Arrowhead start (0–1)
Double arrow msoShapeLeftRightArrow 2 Arrowhead width (0–0.5) Shaft height (0–0.5)
Chevron msoShapeChevron 1 Notch depth (0–1)
Pentagon arrow msoShapePentagon 1 Point depth (0–1)
Rounded rectangle msoShapeRoundedRectangle 1 Corner radius (0–0.5)
Rectangular callout msoShapeRectangularCallout 2 Pointer X Pointer Y
Oval callout msoShapeOvalCallout 2 Pointer X Pointer Y
Bent arrow msoShapeBentArrow 2 Bend point Shaft width
Circular arrow msoShapeCircularArrow 5 Start angle End angle

Discovering unknown adjustments

Create the shape manually in PowerPoint, drag the yellow diamond handle while recording a macro (View → Macros → Record Macro). The recorded VBA code shows the exact adjustment values.


Complete Example: Process Diagram

// Three connected steps with arrow separators
var steps = new[] {
    ("Input",    Color.FromArgb(68,  114, 196)),
    ("Process",  Color.FromArgb(112, 173,  71)),
    ("Output",   Color.FromArgb(255, 102,   0))
};

float startX = 50f;
for (int i = 0; i < steps.Length; i++)
{
    // Process box
    float bx = startX + i * 195f;
    dynamic oBox = ppptools.AddShape(
        MsoAutoShapeType.msoShapeRoundedRectangle, bx, 150, 140, 80);
    oBox.Adjustments[1] = 0.06f;
    ppptools.SetFill(oBox, steps[i].Item2);
    ppptools.HideLine(oBox);
    ppptools.SetText(oBox, steps[i].Item1,
        color: Color.White, bold: true, fontSize: 12f,
        align: PowerPoint.PpParagraphAlignment.ppAlignCenter);

    // Connector arrow (except after last element)
    if (i < steps.Length - 1)
    {
        dynamic oArr = ppptools.AddShape(
            MsoAutoShapeType.msoShapeRightArrow, bx + 145f, 170f, 45f, 40f);
        oArr.Adjustments[1] = 0.6f;   // arrowhead at 60 %
        oArr.Adjustments[2] = 0.25f;  // shaft = 25 % of height
        ppptools.SetFill(oArr, Color.FromArgb(150, 150, 150));
        ppptools.HideLine(oArr);
    }
}

Back: PPPTools Reference · AutoShape Types