Этот раздел имеет в своем составе демонстрационный код, который показывает, как создать отсеченный путь, состоящий из строки символов. Пример создает логический шрифт и использует его, чтобы прописать строку в пределах отсеченного пути, затем заполняет путь, рисуя горизонтальные и вертикальные линии.
// DoClipPat - Рисует отсеченный путь, используя указанную строку
// Возвращаемое значение - ИСТИНА (TRUE) в случае успеха; иначе - ЛОЖЬ (FALSE)
// lplf - адрес структуры LOGFONT, определяющей шрифт, который используется,
// чтобы рисовать отсеченный путь
// lpsz - адрес строки, которая используется для отсеченного пути
BOOL DoClipPath(LPLOGFONT lplf, LPSTR lpsz)
{
LOGFONT lf; // структура логического шрифта
HFONT hfont; // дескриптор нового логического шрифта
HFONT hfontOld; // дескриптор исходного логического шрифта
HDC hdc; // дескриптор контекста устройства (DC) дисплея
int nXStart, nYStart; // координаты рисования
RECT rc; // структура прямоугольника для рисования окна
SIZE sz; // структура размера, которая получает протяженности текста
int nStrLen; // длина строки
int i; // счетчик цикла
HRESULT hr;
size_t * pcch;
// Извлеките кэшированный контекст устройства (DC) для окна.
hdc = GetDC(hwnd);
// Сотрите текущее содержание окна.
GetClientRect(hwnd, &rc);
FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH));
// Используйте указанный шрифт, чтобы создать логический шрифт и выберите его
// в контекст устройства (DC).
hfont = CreateFontIndirect(lplf);
if (hfont == NULL)
return FALSE;
hfontOld = SelectObject(hdc, hfont);
// Создайте отсеченный путь.
hr = StringCchLength(lpsz, STRSAFE_MAX_CCH, pcch);
if (FAILED(hr))
{
// Что сделать: обработчик ошибки при записи
}
nStrLen = *pcch
BeginPath(hdc);
TextOut(hdc, nXStart, nYStart, lpsz, nStrLen);
EndPath(hdc);
SelectClipPath(hdc, RGN_DIFF);
// Извлеките размеры прямоугольника, окружающего текст.
GetTextExtentPoint32(hdc, lpsz, nStrLen, &sz);
// Нарисуйте горизонтальные линии по отсеченному пути.
for (i = nYStart + 1; i < (nYStart + sz.cy); i += 3)
{
MoveToEx(hdc, nXStart, i, (LPPOINT) NULL);
LineTo(hdc, (nXStart + sz.cx), i);
}
// Нарисуйте вертикальные линии по отсеченному пути.
for (i = nXStart + 1; i < (nXStart + sz.cx); i += 3)
{
MoveToEx(hdc, i, nYStart, (LPPOINT) NULL);
LineTo(hdc, i, (nYStart + sz.cy));
}
// Выберите исходный шрифт в контекст устройства (DC) и освободите контекст устройства (DC).
SelectObject(hdc, hfontOld);
DeleteObject(hfont);
ReleaseDC(hwnd, hdc);
return TRUE;
}
|
Пример, который демонстрирует, как приложение создает прямоугольный регион отсечения, см. главу Регионы.