Этот раздел имеет в своем составе демонстрационный код, который показывает, как создать отсеченный путь, состоящий из строки символов. Пример создает логический шрифт и использует его, чтобы прописать строку в пределах отсеченного пути, затем заполняет путь, рисуя горизонтальные и вертикальные линии.
// 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; }
|
Пример, который демонстрирует, как приложение создает прямоугольный регион отсечения, см. главу Регионы.