As most things happening in a TouchUI app, the action begins in the main form (MainForm), and that is also true for the painting of all the graphics. To take full control over how the graphics is drawn in an app, the form's OnPaint method should be overridden, like this:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
dialogStack.Last().Paint(Common.Instance.PaintGraphics);
Rectangle r = Common.Instance.ClientRectangle;
e.Graphics.DrawImage(Common.Instance.PaintBitmap, r, r, GraphicsUnit.Pixel);
}
The Common.Instance is a singleton used to store global things in the app, and is hold the current screen dimensions (ClientRectangle). It also holds an instance of the GDI Graphics class (PaintGraphics) pointing to a bitmap (PaintBitmap) that is used to draw to the screen (via e.Graphics). The bitmap is used as a buffer instead of doing the different GDI painting operations directly to the screen, and that is a good practice (called "double buffering") that will help you avoid things like screen flickering. Another important measure to avoid flickering is to override the OnBackGround like this:
protected override void OnPaintBackground(PaintEventArgs e) { }
Note that I don't call the form's (base class) implementation (base.OnPaintBackground).
So, we have a way of making the currently active dialog responsible for the painting of the screen, and this is an example of the Paint method of the main dialog:
public override void Paint(Graphics g)
{
g.Clear(BackColor);
g.DrawString(this.Text, NormalFont, HighBrush, 8, 5);
g.DrawLine(NormalPen, 0, 23, Rectangle.Width, 23);
}
This code takes care of painting (clearing) the background, the heading text, and the horizontal line below the heading. The result looks something like this:
As we will see in some of the upcoming parts of this series, the dialog continues to pass the responsibility of painting to each of its controls, that does their work in much the same way.