Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода по ОАиП.doc
Скачиваний:
12
Добавлен:
11.05.2015
Размер:
3.21 Mб
Скачать

Инструмент Pen

Для отображения контурных примитивов используется перо, выбранное в контексте, определяющее цвет, ширину и стиль линии, который может быть сплошным (solid), точечным (dotted) или пунктирным (dashed).

По умолчанию устанавливается одно из трех стандартных перьев, рисующих сплошные линии толщиной в единицу, выбранного цвета: BLACK­PEN – черное перо, WHITE_PEN – белое перо и NULL_PEN – пустое перо, которое ничего не рисует.

Определив переменную, например, hPenтипаHPEN(описатель пера –handle to a pen):HPEN hPen; получить описатель одного из стандартных перьев, например белого пера, можно, вызывая функцию

hPen=GetStockObject(WHITE_PEN);

сделаем это перо текущим, вызвав функцию

SelectObject (hdc,hPen);

После этого все линии будут использовать белое перо до тех пор, пока не выберем другое перо в контекст устройства или пока не освободим контекст устройства.

Все вышесказанное можно совместить в одной инструкции:

hPen = SelectObject (hdc, GetStockObject (WHITE_PEN));

Если это первый вызов, функция SelectObjectвозвращает описатель того пера, которое уже было выбрано в контексте устройства; текущим пером становится белое, а переменнаяhPenполучает описатель предыдущего (по умолчанию – черного) пера, вернуться к которому можно, используя вызов

SelectObject(hdc,hPen);

Для создания пераиспользуются функцииCreatePenилиCreatePen­Indirect(ExtCreatePen).

Функция CreatePen:

hPen = CreatePen (iPenStyle, iWidth, rgbColor);

параметр iPenStyleопределяет стиль линии и может принимать одно из семи значений (семь стилей пера):PS_SOLID– сплошное,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT– штриховое, пунктирное и штрихпунктирное,PS_NULL– нерисующее (пустое) перо,PS_INSIDEFRAME– внутренняя обводка, в замкнутом контуре автоматически отступает внутрь в соответствии с толщиной линии.

Для стилей PS_SOLID,PS_NULLиPS_INSIDEFRAMEпараметрiWidthзадает ширину пера, приiWidth= 0 – перо шириной в один пиксел.

Параметр rgbColor– цвет пера; для перьев всех стилей, кромеPSINSIDE­FRAME, преобразуется в ближайший чистый цвет, стильPS_INSIDE­FRAMEпозволяет использовать полутона при ширине больше 1.

Можно создать перо, определив структуру LOGPEN logpen («логи­ческое перо» –logicalpen), содержащую поля:

lopnStyle(UINT) – стиль пера;

lopnWidth(POINT) – ширина пера в логических единицах измерения;

lopnColor(COLORREF) – цвет пера.

Затем создаем перо, передавая адрес структуры в функцию CreatePenIndirect:

hPen=CreatePenIndirect(&logpen);

Получить информацию об уже существующем пере можно, используя функцию

GetObject (hPen, sizeof(LOGPEN), &logpen);

Функции CreatePenиCreatePenIndirectне требуют описателя контекста устройства. Эти функции создают логические перья, которые никак не связаны с контекстом устройства до тех пор, пока не вызвать функциюSelectObject.

Рассмотрим метод создания, выбора и удаления перьев. Предположим, в программе используются два пера – красное шириной 3 и черное точечное. Определим переменные для хранения описателей этих перьев:

staticHPENhPen1,hPen2;

В процессе обработки сообщения WM_CREATEсоздадим перья:

hPen1 = CreatePen (PS_SOLID, 3, RGB (255, 0, 0));

hPen2 =CreatePen(PS_DOT, 0, 0);

В процессе обработки сообщения WM_PAINTили когда есть действительный контекст устройства, выберем одно из этих перьев в контекст устройства и можем рисовать, используя его:

SelectObject(hdc,hPen2);

[функции рисования линий]

SelectObject(hdc,hPen1);

[другие функции рисования линий]

В процессе обработки сообщения WM_DESTROYудалить их:

DeleteObject(hPen1);

DeleteObject(hPen2);

Можно создать перья в процессе обработки сообщения WM_PAINTи удалить их после вызоваEndPaint.

Можно объединить вызовы функций CreatePenиSelectObjectв одну инструкцию:

SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0)));

Удалить перо можно, выбрав стандартное перо BLACK_PENв контекст устройства и удаления значения, возвращаемого функциейSelectObject:

DeleteObject (SelectObject (hdc, GetStockObject (BLACK_PEN)));

Выбирая только что созданное перо в контекст устройства, сохраним описатель, возвращаемый функцией SelectObject:

hPen = SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0)));

Если это первый вызов, hPen– описатель стандартного черного пера, мы можем теперь выбрать его в контекст устройства и удалить созданное перо (описатель, возвращаемый вызовом функцииSelectObject) в одной инструкции:

DeleteObject (SelectObject (hdc, hPen));