Using Clipping

This section contains example code that shows how to generate a clip path consisting of a character string. The example creates a logical font and uses it to draw a string within a clip path, then fills the path by drawing horizontal and vertical lines.


// DoClipPat - Draws a clip path using the specified string 
// Return value - TRUE if successful; FALSE otherwise 
// lplf - address of a LOGFONT structure that defines the font to 
//        use to draw the clip path 
// lpsz - address of a string to use for the clip path 
 
BOOL DoClipPath(LPLOGFONT lplf, LPSTR lpsz) 
{ 
    LOGFONT lf;           // logical font structure 
    HFONT hfont;          // new logical font handle 
    HFONT hfontOld;       // original logical font handle 
    HDC hdc;              // display DC handle 
    int nXStart, nYStart; // drawing coordinates 
    RECT rc;              // rectangle structure for painting window 
    SIZE sz;              // size structure that receives text extents 
    int nStrLen;          // length of the string 
    int i;                // loop counter 
 
    // Retrieve a cached DC for the window. 
 
    hdc = GetDC(hwnd); 
 
    // Erase the current window contents. 
 
    GetClientRect(hwnd, &rc); 
    FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH)); 
 
    // Use the specified font to create a logical font and select it 
    // into the DC. 
 
    hfont = CreateFontIndirect(lplf); 
    if (hfont == NULL) 
        return FALSE; 
    hfontOld = SelectObject(hdc, hfont); 
 
    // Create a clip path. 
 
    nStrLen = lstrlen(lpsz); 
    BeginPath(hdc); 
        TextOut(hdc, nXStart, nYStart, lpsz, nStrLen); 
    EndPath(hdc); 
    SelectClipPath(hdc, RGN_DIFF); 
 
    // Retrieve the dimensions of the rectangle surrounding 
    // the text. 
 
    GetTextExtentPoint32(hdc, lpsz, nStrLen, &sz); 
 
    // Draw horizontal lines through the clip path. 
 
    for (i = nYStart + 1; i < (nYStart + sz.cy); i += 3) 
    { 
       MoveToEx(hdc, nXStart, i, (LPPOINT) NULL); 
       LineTo(hdc, (nXStart + sz.cx), i); 
    } 
 
    // Draw vertical lines through the clip path. 
 
    for (i = nXStart + 1; i < (nXStart + sz.cx); i += 3)
    { 
       MoveToEx(hdc, i, nYStart, (LPPOINT) NULL); 
       LineTo(hdc, i, (nYStart + sz.cy)); 
    } 
 
    // Select the original font into the DC and release the DC. 
 
    SelectObject(hdc, hfontOld); 
    DeleteObject(hfont); 
    ReleaseDC(hwnd, hdc); 
 
    return TRUE; 
} 
 

For an example that demonstrates how an application creates a rectangular clipping region, see Regions.