クリッピングの使用
このセクションには、文字列で構成されるクリップ パスを生成する方法を示すコード例が含まれています。 この例では、論理フォントを作成し、それを使用してクリップ パス内に文字列を描画し、水平線と垂直線を描画してパスを塗りつぶします。
// 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
HRESULT hr;
size_t * pcch;
// 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.
hr = StringCchLength(lpsz, STRSAFE_MAX_CCH, pcch);
if (FAILED(hr))
{
// TODO: write error handler
}
nStrLen = *pcch
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;
}
アプリケーションで四角形のクリッピング領域を作成する方法を示す例については、「 リージョン」を参照してください。