While starting to experiment with the FreeFormActivityDesigner (about which the following post will handle), I did some further exploration of the ActivityDesigner base class and what can be done with custom drawing. That will be the subject of this post.
Overriding the OnPaint event
This one is rather simple and complex at the same time.
Overriding the OnPaint method gives you with the argument the chance to implement your own custom drawing functionality. There is however one caveat: the coordinates for positioning drawing elements on the screen are logical coordinates. Thus, the upper^left corner of your designer is not at coordinates (0,0) but at (ActivityDesigner.Bounds.X,ActivityDesigner.Bounds.Y)
So, to draw a black circle for your activity, you use following code:
protected override void OnPaint(ActivityDesignerPaintEventArgs e)
e.Graphics.FillEllipse(new SolidBrush(Color.Black), Bounds);
Now, isn’t this simple? Yes it is.
Then where is the complexity? If you are knowledgeable with the Graphics object I suppose there is no complexity. But if you’re not, you have another subject to study.
Recap: Designer – Activity interaction
In the previous post I allready showed you how to get at the activity associated with the designer. Afterall: the “raison de vivre” of the ActivityDesigner is the Activity it represents.
When setting properties of the Activity, the designer framewotk also triggers a redraw of the associated ActivityDesigner and thus calls the OnPaint method. This allows you to update the visuals of your designer using the properties of the activity.
Glyphs: why do we need them
When starting to experiment with this custom drawing I also started wondering why one would need custom glyphs. The reason however is very simple: the Graphics object you receive in the OnPaint method only allows you to draw inside the rectangular Bounds defined box of the ActivityDesigner. Glyphs however allow you to draw outside of this box.
An application of this could be if you for example want to render connection ports on the boundary of your custom ActivityDesigner.
Glyphs are associated with an ActivityDesigner and can draw relative to this associated designer. You can see this by the signature of the methods:
public override System.Drawing.Rectangle GetBounds(ActivityDesigner designer, bool activated)
protected override void OnPaint(System.Drawing.Graphics graphics,
As you can see from these signatures, they all have an ActivityDesigner parameter passed in. This is the designer associated with the glyph. It allows you to get it’s bounds and position your glyph relative to it.
In the associated code you can find sample code for the above explanations. Hope you enjoy it.