Использование отсечения


Этот раздел имеет в своем составе демонстрационный код, который показывает, как создать отсеченный путь, состоящий из строки символов. Пример создает логический шрифт и использует его, чтобы прописать строку в пределах отсеченного пути, затем заполняет путь, рисуя горизонтальные и вертикальные линии.

// 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; 
} 

 

Пример, который демонстрирует, как приложение создает прямоугольный регион отсечения, см. главу Регионы.

Назад в оглавление
На главную страницу

Hosted by uCoz