Example: Arrow with Adjustments
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.0–1.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