3 steps to show how to draw vertical and horizontal
dotted lines(1 pixel on 2) using GDI calls. This code works under all
Win32 platforms.
Step 1 (initialization)
A patterned brush is created during program (or view) initialization.
This brush will be used to draw the dotted lines :
{
...
// Create a dotted monochrome bitmap
WORD b[8] = { 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA,
0x5555 };
BITMAP bm;
bm.bmType = 0;
bm.bmWidth = 16;
bm.bmHeight = 8;
bm.bmWidthBytes = 2;
bm.bmPlanes = 1;
bm.bmBitsPixel = 1;
bm.bmBits = b;
HBITMAP hbm = CreateBitmapIndirect(&bm);
// Create the brush from the bitmap bits
HBRUSH hPatternBrush = CreatePatternBrush(hbm);
// Delete the useless bitmap
DeleteObject(hbm);
...
}
Step 2 (drawing)
Dotted lines are drawn using PatBlt() :
{
...
// Select the patterned brush into the DC
HBRUSH oldBrush = (HBRUSH)SelectObject(hDC, hPatternBrush);
// Draw an horizontal line
PatBlt(hDC, 10, 10, 300, 1, PATCOPY);
// Invert a vertical line 2 pixels wide
PatBlt(hDC, 10, 10, 2, 300, PATINVERT);
// Clean up
SelectObject(hDC, oldBrush);
...
}
If drawing occurs in a “scrollable view”, don’t forget to align the
brush origin
into the DC BEFORE to select the brush :
{
...
// We are in a CScrollView, the patterned brush must be aligned
UnrealizeObject(hPatternBrush);
CPoint sp = GetDeviceScrollPosition();
SetBrushOrgEx(hDC, -sp.x & 7, -sp.y & 7, NULL);
// Select the patterned brush into the DC
HBRUSH oldBrush = (HBRUSH)SelectObject(hDC, hPatternBrush);
...
}
Step 3 (destruction)
When the patterned brush is useless, it must be destroyed :
{
...
// Delete the patterned brush
DeleteObject(hPatternBrush);
...
}