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); ... }