Иллюстрированный самоучитель по Visual Studio.Net

грузоперевозки москва-спб | интернет магазин спортивных товаров | Фотограф в обнинске по материалам www.zagogulina.com. | фиксатор звездочка | частные интим фото |

Косметическое перо - часть 2


DWORD dw = PS_COSMETIC | dwPenStyle[i];

// Создаем перо толщиной в 1 пиксел

HPEN hp = ExtCreatePen(dw, 1, Sib, 0,NULL);

//===== Выбираем перо в контекст устройства

HPEN hOld = (HPEN)SelectObject(hdc,hp); iYPos += szText.cy;

// Сдвиг позиции

//===== Помещаем перо в точку (10, iYPos)

MoveToEx(hdc, 10, iYPos, NULL);

//==== Проводим линию до точки (iXMax, iYPos)

LineTo(hdc, iXMax, iYPos);

//== Возвращаем старое перо в контекст устройства

SelectObject(hdc, hold);

//=== Освобождаем ресурс пера DeleteObject(hp);

//=== Выводим поясняющий текст

TextOut(hdc, 10, iYPos, style[i].c_str(), style [i] .size ()

} ;

EndPaint(hWnd, &ps) ;

break;

Комментарии в тексте поясняют суть происходящего. Отметьте, что здесь применена стандартная тактика работы с ресурсами GDI, которая состоит из последовательности следующих шагов:

  • создаем свой инструмент;

  • выбираем его в контекст устройства (SelectObject) и одновременно запоминаем тот инструмент, который используется в контексте в настоящий момент;

  • рисуем с помощью нашего инструмента;

  • возвращаем в контекст прежний инструмент;

  • освобождаем память, занимаемую нашим инструментом.

Так как система работает с ресурсами GDI динамически, то нарушение этой тактики может привести к недостатку памяти и непредсказуемому поведению приложения. Перед тем как запустить проект, попробуйте ответить на вопросы:

  • Будет ли изменяться цвет линий при пользовании стандартным диалогом, который мы уже реализовали?

  • Будет ли изменяться цвет текста при тех же условиях?

Теперь запустите приложение и протестируйте его, изменяя размеры окна и пользуясь диалогом. Как вы узнали из документации, косметическое перо может иметь толщину только в 1 пиксел. Если косметическое перо имеет еще один атрибут PS_ALTERNATE, то каждый второй пиксел линии пропускается (не выводится) и создается иллюзия, что перо стало тоньше, чем 1 пиксел. Опробуем эту возможность в нашем примере. Для этого введите в функцию WndProc еще один локальный массив подсказок.



Начало  Назад  Вперед