Инструмент 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 или CreatePenIndirect (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 – цвет пера; для перьев всех стилей, кроме PS_INSIDEFRAME, преобразуется в ближайший чистый цвет, стиль PS_INSIDEFRAME позволяет использовать полутона при ширине больше 1.
Можно создать перо, определив структуру LOGPEN logpen («логическое перо» – logical pen), содержащую поля:
lopnStyle (UINT) – стиль пера;
lopnWidth (POINT) – ширина пера в логических единицах измерения;
lopnColor (COLORREF) – цвет пера.
Затем создаем перо, передавая адрес структуры в функцию CreatePenIndirect:
hPen = CreatePenIndirect (&logpen);
Получить информацию об уже существующем пере можно, используя функцию
GetObject (hPen, sizeof(LOGPEN), &logpen);
Функции CreatePen и CreatePenIndirect не требуют описателя контекста устройства. Эти функции создают логические перья, которые никак не связаны с контекстом устройства до тех пор, пока не вызвать функцию SelectObject.
Рассмотрим метод создания, выбора и удаления перьев. Предположим, в программе используются два пера – красное шириной 3 и черное точечное. Определим переменные для хранения описателей этих перьев:
static HPEN hPen1, 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));
Дата добавления: 2014-12-30; просмотров: 682;