Creating Single Pixel Dotted Lines

How to create dotted lines like the ones used to draw lines in the TreeView control

Demonstration Project in Action

One of the drawing features which makes many of the Windows controls draw attractively is the use of single pixel on-off dotted lines. For example, the TreeView control uses these to draw lines, and they are often used in bounding box selections and drag and drop operations.

Unfortunately VB doesn't have any built in methods to draw single pixel dotted lines (although you could use, erm, PSet to draw the dots, as long as you didn't mind waiting for a couple of days whilst VB completed drawing the line). This is because Windows doesn't provide a Pens which draw in this style either, and VB's line drawing support exclusively uses the Pen features provided by GDI. So how do the controls draw dotted lines?

Drawing Pixel-Accurate Dotted Lines

To draw pixel-accurate patterns you use a GDI object called a Pattern Brush, which is a brush object created from a monochrome bitmap. You can either fill areas using this brush with the FillRect function or you can select the brush into a device context and use the PatBlt function to draw a rectangular area. The advantage of the PatBlt function is it allows you to specify a Raster Operation constant, such as PATINVERT which XORs the brush with the background. This is really helpful if you are creating a selection box, because XORing the same brush twice into an area leaves the area the same as when you started.

Pattern brushes automatically adjust foreground and background colours to match the device context they are being used in. The black pixels map to the foreground colour and the white pixels to the background.

Demonstration

The demonstration project includes a class, cDottedBrush which creates a chessboard pattern brush, and demonstrates how to draw lines and fill areas using the brush on screen.