Использование путей
Этот раздел содержит пример кода, который позволяет пользователю выбрать шрифт определенного размера (с помощью диалогового окна Выбор шрифта), выбрать путь к клипу (с помощью текста, нарисованного с помощью этого шрифта), а затем просмотреть результат обрезки к тексту.
Этот пример кода использовался для создания иллюстрации, которая отображается в разделе Пути к клипам.
CHOOSEFONT cf; // common dialog box font structure
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; // structure for painting window
SIZE sz; // structure that receives text extents
double aflSin[90]; // sine of 0-90 degrees
double aflCos[90]; // cosine of 0-90 degrees
double flRadius,a; // radius of circle
int iMode; // clipping mode
HRGN hrgn; // clip region handle
LRESULT APIENTRY MainWndProc(
HWND hwnd, // window handle
UINT message, // type of message
WPARAM wParam, // additional information
LPARAM lParam) // additional information
{
PAINTSTRUCT ps;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
break;
case WM_COMMAND: // command from app's menu
switch (wParam)
{
case IDM_VANISH: // erases client area
hdc = GetDC(hwnd);
GetClientRect(hwnd, &rc);
FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH));
ReleaseDC(hwnd, hdc);
break;
case IDM_AND: // sets clip mode to RGN_AND
iMode = RGN_AND;
break;
case IDM_COPY: // sets clip mode to RGN_COPY
iMode = RGN_COPY;
break;
case IDM_DIFF: // sets clip mode to RGN_DIFF
iMode = RGN_DIFF;
break;
case IDM_OR: // sets clip mode to RGN_OR
iMode = RGN_OR;
break;
case IDM_XOR: // sets clip mode to RGN_XOR
iMode = RGN_XOR;
break;
case IDM_CLIP_PATH:
// Retrieve a cached DC for the window.
hdc = GetDC(hwnd);
// Use the font requested by the user in the
// Choose Font dialog box to create a logical
// font, then select that font into the DC.
hfont = CreateFontIndirect(cf.lpLogFont);
hfontOld = SelectObject(hdc, hfont);
// Retrieve the dimensions of the rectangle
// that surrounds the text.
GetTextExtentPoint32(hdc, "Clip Path", 9, &sz);
// Set a clipping region using the rect that
// surrounds the text.
hrgn = CreateRectRgn(nXStart, nYStart,
nXStart + sz.cx,
nYStart + sz.cy);
SelectClipRgn(hdc, hrgn);
// Create a clip path using text drawn with
// the user's requested font.
BeginPath(hdc);
TextOut(hdc, nXStart, nYStart, "Clip Path", 9);
EndPath(hdc);
SelectClipPath(hdc, iMode);
// Compute the sine of 0, 1, ... 90 degrees.
for (i = 0; i < 90; i++)
{
aflSin[i] = sin( (((double)i) / 180.0)
* 3.14159);
}
// Compute the cosine of 0, 1,... 90 degrees.
for (i = 0; i < 90; i++)
{
aflCos[i] = cos( (((double)i) / 180.0)
* 3.14159);
}
// Set the radius value.
flRadius = (double)(2 * sz.cx);
// Draw the 90 rays extending from the
// radius to the edge of the circle.
for (i = 0; i < 90; i++)
{
MoveToEx(hdc, nXStart, nYStart,
(LPPOINT) NULL);
LineTo(hdc, nXStart + ((int) (flRadius
* aflCos[i])),
nYStart + ((int) (flRadius
* aflSin[i])));
}
// Reselect the original font into the DC.
SelectObject(hdc, hfontOld);
// Delete the user's font.
DeleteObject(hfont);
// Release the DC.
ReleaseDC(hwnd, hdc);
break;
case IDM_FONT:
// Initialize necessary members.
cf.lStructSize = sizeof (CHOOSEFONT);
cf.hwndOwner = hwnd;
cf.lpLogFont = &lf;
cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
cf.rgbColors = RGB(0, 255, 255);
cf.nFontType = SCREEN_FONTTYPE;
// Display the Font dialog box, allow the user
// to choose a font, and render text in the
// window with that selection.
if (ChooseFont(&cf))
{
hdc = GetDC(hwnd);
hfont = CreateFontIndirect(cf.lpLogFont);
hfontOld = SelectObject(hdc, hfont);
crOld = SetTextColor(hdc, cf.rgbColors);
TextOut(hdc, nXStart, nYStart,
"Clip Path", 9);
SetTextColor(hdc, crOld);
SelectObject(hdc, hfontOld);
DeleteObject(hfont);
ReleaseDC(hwnd, hdc);
}
break;
default:
return DefWindowProc(hwnd, message, wParam,
lParam);
}
break;
case WM_DESTROY: // window is being destroyed
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}