69656

Робота з пір’ям і кистями

Практическая работа

Информатика, кибернетика и программирование

Для відображення графіки, тексту і зображень в світі GDI використовуються пір’я і кисті. Інтерфейс GDI надає цілий набір функцій API, за допомогою яких додаток може створювати спеціальне пір’я і кисті, наприклад, CreatePen, CreateSolidBrush, CreateHatchBrush і CreatePatternBrush.

Украинкский

2014-10-08

63 KB

0 чел.

Тема 10. Робота з пір'ям і кистями

Для відображення графіки, тексту і зображень в світі GDI використовуються пір'я і кисті. Інтерфейс GDI надає цілий набір функцій API, за допомогою яких додаток може створювати спеціальне пір'я і кисті, наприклад, CreatePen, CreateSolidBrush, CreateHatchBrush і CreatePatternBrush. Бібліотека MFC інкапсулює ці функції в класах Среп і CBrush, що дозволяє істотно полегшити роботу з пір'я і кистями, не звертаючись до низькорівневих функцій, GDI, що надається. Отже, розглянемо роботу з пір'ям і кистями.

Пера

Перо (pen) — це об'єкт GDI, який використовують для промальовування ліній, кривих і контурів геометричних фігур. Визначення пера має на увазі установку трьох основних параметрів: стилю (style), ширини (width) і кольору (color). Клас Среп володіє трьома переобтяженими конструкторами, що дозволяють по-різному встановити ці параметри.

Среп () ; Среп (

int nPenStyle

int nWidth

COLORREF crColor

>;

CPen(

int nPenStyle

int nWidth

const LOGBRUSH* pLogBrush

int nStyleCount = 0

const DWORD* IpStyle = NULL

);

Найпростіший спосіб створення пера GDI полягає в створенні об'єкту класу Среп і передачі йому необхідних для визначення пера параметрів. У приведеному нижче прикладі визначено заповнене перо шириною в один піксель червоного кольору. Среп  pen(PS_SOLID,    I,   RGB(255,    0,    0));

Другий спосіб створення пера GDI полягає в застосуванні версії конструктора без параметрів і подальшого виклику функцій Среп: :CreatePen, Среп: :CreatePenIndirect або Среп: :CreateStockObject, що дозволяють визначити атрибути стилю, ширини і кольору пера. Ця методика використовується у тому випадку, коли перо необхідно визначити як член іншого класу (наприклад, класу уявлення), а потім викликати функцію CreatePen в тілі функції ініціалізації класу того, що використовує перо (наприклад, функції OnlnitialUpdate класу уявлення). У приведеному нижче фрагменті коди для створення двох окремих екземплярів об'єкту класу Среп використовуються конструктори без параметрів. Обидва пера, як і в попередньому фрагменті коди, будуть створені заповненими, шириною в I піксель, червоного кольору. Тут, до речі, продемонстровано ще два методи створення пера. CP&n   penl;

penl.CreatePen(PS_SOLID,    l,   RGB(255,   0,    0)); Среп   Реп2; LOGPEn   logpen;

logpen.lopnStype   =   PS_SOLID; logpen.lopnWidth   =   1; logpen.IpenColor   =  RGB(255,    0,    0); pen-CreatePenlndirect(slogpen);

Звернете увагу, обидві функції (CreatePen і CreatePenlndirect) повертають значення TRUE, якщо перо створене успішно, і значення FALSE інакше. Якщо створення пера покласти на конструктор об'єкту (звернувшись до будь-якого конструктора класу Среп, що приймає аргументи), то у разі неможливості створити перо буде передано виключення типу CResourceException. Це може відбутися тільки в тому випадку, якщо системі катастрофічно не вистачає пам'яті, і ця ситуація повинна розглядатися як украй серйозна, оскільки якщо додатку не вдалося створити навіть не такий вимогливий до ресурсів об'єкт, як одне єдине перо, то дуже сумнівно, що додаток зможе зробити що-небудь ще.

Приведеному нижче конструктору можна передати структуру Типу LOGBRUSH. Хоча кисті розглядатися в наступному розділі, але приведений нижче фрагмент коди, окрім пера, дозволяє створити геометричну кисть (geometric brush).

LOGBRUSH   logBrush;

logBrush.lbStyle   =  BS_SOLID;

logBrush.lbColor = RGB (0,255,0);

Зреп  myPen2(PS_D0T   I    PS_GEOMETRIC   I    PS_ENDCAP_ROUND

2,

firlogBrush) ;

У декількох приведених вище прикладах стиль пера був визначений як PS_S0LID (заповнена), а в останньому прикладі застосовувалася комбінація з декількох стилів. Габл. 8.4 містить повний список всіх доступних стилів пера.

Стиль Опис

ps_solid Заповнене перо

ps_dash Пунктирне перо. Цей стиль допустимий лише для пера шириною в 1 одиницю устрой-

ства і менше

ps_dot Точкове перо. Цей стиль допустимий лише для пера шириною в 1 одиницю устройст-

ва і менше

ps_dashdot Штріх-пунктірноє перо (дозволяє створити лінію, де крапки чергуються з черточка-

мі). Цей стиль допустимий лише для пера шириною в 1 одиницю пристрою і менше

ps_dashdotdot    Штріх-точечноє перо (дозволяє створити лінію, де риски чергуються з двома крапками). Цей стиль допустимий лише для пера шириною в 1 одиницю пристрою і менше

ps_null Порожнє перо або перо null (перо, яке нічого не малює)

ps_insideframe Це перо малює лінії усередині замкнутих геометричних фігур, що створюються функціями GDI, здатними визначати обмежувальний прямокутник

Перо NULL не малює нічого. Виникає цілком резонне питання: "Навіщо воно тоді потрібне взагалі?" Хочете вірте, хочте немає, але порожнє перо застосовують достатньо часто. Припустимо, що необхідно намалювати заповнений червоний круг без всяких меж. Якщо малювати круг за допомогою функції MFC CDC : : Ellipse, то Windows автоматично обкреслить крутий тим пером, яке вибране в контекст пристрою зараз. Функції Ellipse неможливо повідомити про те, що межу малювати не потрібно, але можна вибрати в контекст пристрою порожнє перо, і круг не матиме видимої межі.

Другим параметром, передаваним функції об'єкту Среп, призначеній для створення пера, є його ширина, тобто ширина лінії, яку перо малюватиме. Ширину пера указують в логічних одиницях, фактичне значення яких залежить від режиму відображення. Пір'я стилю PS_SOLID, PS_NULL і PS_INSIDEFRAME можна створювати будь-якої логічної ширини, але для пір'я інших стилів застосовна ширина лише в одну логічну одиницю. Якщо вказати ширину пера рівної нулю, то незалежно від стилю і режиму відображення буде створено перо шириною в один піксель.

Третій і останній параметр визначає колір створюваного пера. Це 24-розрядний колір у форматі RGB (де кожен можливий колір визначений співвідношенням червоного, зеленого і синього кольорів в діапазоні від 0 до 255 кожен).

Операційна система Windows надає три спеціальних, заздалегідь зумовлених заповнених пера шириною в 1 піксель, які можна використовувати, не створюючи об'єкт пера явно. Цей набір пір'я (stock pens) належить групі об'єктів GDI, відомій як набір об'єктів (stock objects) і створюваних функцією CreateStockObject. Набір надає таке пір'я, як WHITE__PEN, BLACK_PEN і NULL_PEN (біле, чорне і порожнє перо відповідно). Приведений нижче код отримує біле перо з набору:

Среп   Ріпи;

Pen.CreateStockObject(   WHITE_PEN   );

А наступний код створює ідентичне біле перо, але не з набору об'єктів:

Среп   Ріпи;

Pen.CreatePen(   PS_SOLID,    l,   RGB(   255,   255,   255   )   );

У випадку, якщо жоден з базових стилів пір'я не задовольняє насущним потребам, то клас Среп надає ще один конструктор, призначений для "косметичного" і геометричного пір'я, що володіє широкою різноманітністю параметрів. Наприклад, можна створити геометричне перо, узор (pattern) якого буде растровим зображенням, а крім того, здійснювати дуже докладне управління різними додатковими параметрами стилів кінців ліній (смуга, круг або квадрат) і стилів перетину (перекіс, поворот або округлення). Приведений нижче код створює геометричне перо шириною 16 одиниць, що малює суцільні зелені лінії з скошеними торцями. Там, де зустрічаються дві лінії, суміжні кінці будуть закруглені, щоб створити гладкий перетин:

LOGBRUSH  LogBrush; LogBrush.lbStyle   =  BS_SOLID; LogBrush.lbColor  =  RGB(0,   255,   0); CPen   Pen(PS_GEOMETRIC   I   PS_S0LID

|    PS_ENDCAP_FLAT    |    PS_JOIN_ROUND

16,    SLogBrush);

Операційна система Windows накладає на використання "косметичного" і геометричного пір'я деякі обмеження. Щоб стилі кінців ліній і перетину спрацювали правильно, геометричні фігури слід спочатку відобразити звичайним способом, а потім обробити за допомогою функції CDC: : StrokePath. Щоб визначити шлях промальовування геометричної фігури, операторів виклику функцій промальовування контура необхідно помістити між зверненнями до функцій CDC: :BeginPath і CDC: :EndPath таким чином:

pDC->BeginPath(); pDC->MoveTo(   0,   0   ); pDC->LineTo(   200,   0   ); pDC->LineTo{   200,   200   ); pDC->LineTo(   0,   200   ); pDC->CloseFigure(); pDC->EndPath() ; pDC->StrokePath();

Кисті

Кисть (brush) — це об'єкт GDI, використовуваний для заповнення геометричних фігур і відображення тексту. Кисті інкапсулює клас CBrush. Існує три основні типи кистей: заповнені, штрихові і візерункові кисті. Заповнені кисті (solid brush) наносять однорідний колір. Якщо поточний апаратний засіб нездібний відобразити колір, визначений заповненою кистю безпосередньо, то операційна система Windows моделює схожий, колір змішуючи ті кольори, які даний пристрій відобразити здатне.

Штрихові кисті (hatch brush) наносять одне з шести штрихувань прийнятих в техніці і архітектурі. Візерункова кисть (pattern brush) здійснює розфарбовування растровим зображенням. Клас CBrush надає конструктори для кожного з типів кистей. Наприклад, заповнену кисть можна створити в одному операторові, передавши конструктору класу CBrush значення C0LORRREF таким чином: CBrush  Brush(   RGB(   255,   0,    0   )   );

Але це можна зробити і в двох операторах, створивши спочатку неініціалізований об'єкт класу CBrush, а потім викликати функцію CBrush: : CreateSolidBrush таким чином:

CBrush Brush;

Brush.CreateSolidBrush(   RGB(   255,    0,    0   )   );

У обох випадках буде створено заповнене гроно яскраво-червоного кольору. Кисть можна створити також, инициализировав структуру LOGBRUSH і викликавши функцію CBrush: :CreateBrushIndirect. Подібно до конструкторів класу Среп, всі конструктори класу CBrush передають виключення при неможливості створити кисть (нагадаємо, причиною неможливості створення кисті є критичний недолік пам'яті).

При створенні штрихових кистей конструктору класу CBrush передають індекс штрихування (hatch index) і значення COLORREF. Як альтернатива можна скористатися функцією CBrush: :CreateHatchBrush. Нижче приведений приклад коди, що створює штрихову кисть з перпендикулярними лініями, нахиленими під кутом 45°:

CBrush  Brush(   HS_DIAGCROSS,   RGB (,255,    0,    0   )    );

А наступний приклад коди створює ту ж саму штрихову кисть, але в двох операторах:

CBrush  Brush;

Brush.CreateHatchBrush(   HS_DIAGCROSS,   RGB(   255,   0,    0   )   );_

Штрихування HS_DIAGCROSS— це лише один з шести доступних стилів штрихування. Список всіх доступних стилів штрихування приведений в табл. 8.5.

|-||||ша 8.5. Стилів штрихування

Стиль штрихування Опис

hs_bdiagonal Похила зліва направо під кутом 45°

hs_cross Сітка з горизонтальних і вертикальних ліній

hs_diagcross Сітка під кутом 45°

hs_fdiagonal Похила справа наліво під кутом 45°

hs_horizontal Горизонтальне штрихування

hs_vertical Вертикальне штрихування

При закрашенні штриховою кистю операційна система Windows заповнює простір між штрихами кольором фону, заданим за умовчанням, якщо колір фону поточного контексту пристрою не був змінений за допомогою функції CDC: :SetBkColor або не був відключений взагалі за допомогою режиму фону TRANSPARENT, встановленого функцією CDC: :SetBkMode. Код в приведеному нижче прикладі намалює квадрат розміром 100 пікселів і заповнить його білими лініями штрихування на світло-сірому фоні:

CBrush   Brush!   HS_DIAGCROSS,   RGB(   255,    255,   255   )   ); CBrush   *p01dBrush;

pOldBrush  =  pDC->SelectObject(   SBrush   ); pDC->SetBkColor (   RGB(   192,    192,    192   )   );

pDC->Rectangle(   Про,    0,    100,    Ю0   ); pDC->SelectObject(   pOldBrush   );

У наступному прикладі код намалює чорний прямокутник, заштрихований похилою сіткою, але фон буде прозорим. Режим кольору фону визначає, як Windows заповнюватиме проміжки між лініями штрихування, проміжки усередині ліній, намальованих стилізованим пір'ям, і між символами в текстових рядках: CBrush  Brush {| HS_DIAGCR0SS,   RGB {   0,   0,    0   )    ) ; CBrush  *p01dBrush

pOldBrush  =  pDO>SelectObject (   &Brush   ); pDC->SetBkMode(   TRANSPARENT   ); pDC_>Rectangle(   0,    0,    100,    100   ); pDC->SelectObject(   pOldBrush   );

Операційна система Windows надає набір з семи кистей:

BLACK^BRUSH

DKGRAY_BRUSH

GRAY_BRUSH

LTGRAY_BRUSH

H0LLOW_BRUSH

NULL_BRUSH

WHITEJ3RUSH

Ці кисті є заповненими, а ідентифікатор визначає колір кисті. Значення HOLLOW BRUSH і NULL_J3RUSH — це два разных способу досягнення однієї і тієї ж мети: кисть не закрашує нічого. Призначення аналогічного порожнього пера описувалося в попередньому розділі. Порожні кисті мають подібне призначення. Якщо, наприклад, необхідно намалювати незаповнений круг, то перед його промальовуванням в контекст пристрою слід вибрати порожню кисть.


 

А также другие работы, которые могут Вас заинтересовать

1482. Дискурсивно-лингвистические аспекты искусственного билингвизма 343.72 KB
  Проанализировать существующие точки зрения по проблематике исследования, уточнив соотношение понятия билингвизм со смежным понятием диглоссия. Определить содержание понятия дискурсивно-лингвистическая компетенция билингвов. Установить и описать генезис переводческих механизмов у студентов-билингвов на разных ступенях обучения посредством уточнения понятия единицы перевода.
1483. КОГНИТИВНЫЕ МОДЕЛИ СУБСТАНДАРТНОЙ СЕМАНТИЧЕСКОЙ ДЕРИВАЦИИ 344.53 KB
  Цель диссертационной работы заключается в определении семантической структуры субстандартных дериватов английского и русского языков и установлении системы когнитивных моделей субстандартных глаголов умственной деятельности указанных языков с точки зрения когнитивной лингвистики.
1484. СПЕЦИАЛИЗИРОВАННАЯ ПСИХОЛОГИЧЕСКАЯ ПОМОЩЬ ВЫПУСКНИКАМ КЛАССОВ КОРРЕКЦИОННО-РАЗВИВАЮЩЕГО ОБУЧЕНИЯ С КОНСТИТУЦИОНАЛЬНО-ТИПОЛОГИЧЕСКОЙ ПРЕДИСПОЗИЦИЕЙ ЛИЧНОСТИ 1018.64 KB
  Теоретическое обоснование проблемы конституционально-психотипологической предиспозиции личности в российской психологии. Материал, методы исследования и психологического сопровождения выпускников классов коррекционно-развивающего (компенсирующего) обучения, имеющих конституционально-психотипологическую предиспозицию личности. Сравнительный эмпирический и экспериментально-психологический анализ обследованных подростков.
1485. ПСИХОЛОГО-ПЕДАГОГИЧЕСКОЕ СОПРОВОЖДЕНИЕ ДЕТЕЙ-СИРОТ КАК СРЕДСТВО ИХ СОЦИАЛИЗАЦИИ 1017.35 KB
  Научно-теоретические основы психолого-педагогического сопровождения детей-сирот в условиях детского дома. Организационно-содержательные условия психолого- педагогического сопровождения детей-сирот в условиях детского дома. Модель психолого-педагогического сопровождения детей-сирот в условиях детского дома.
1486. СИМВОЛИКА АРХИТЕКТУРНОГО ЛАНДШАФТА МОСКОВСКОГО КРЕМЛЯ И ОСТРОВА СИТЕ (ПАРИЖ) В ВОСПРИЯТИИ ПРЕДСТАВИТЕЛЕЙ РОССИЙСКИХ И ФРАНЦУЗСКИХ СУБКУЛЬТУР ХIХ – НАЧАЛА ХХ ВВ. 1016.13 KB
  Восприятие символики архитектурных ландшафтов: теоретический обзор в контексте исследования Символика архитектурного ландшафта Московского Кремля в восприятии представителей французских субкультур начала - середины XIX в. Символика архитектурного ландшафта острова Сите в восприятии представителей российских субкультур начала ХIХ в.
1487. СОВЕРШЕНСТВОВАНИЕ ГОСУДАРСТВЕННОГО РЕГУЛИРОВАНИЯ ИННОВАЦИОННОЙ ДЕЯТЕЛЬНОСТИ В ПРОМЫШЛЕННОСТИ 1014.86 KB
  Инновационное развитие в современной экономике (теоретический аспект). Инновационное развитие в промышленности Хабаровского края. Формы и механизмы государственного регулирования инновационной деятельности.
1488. СОВЕРШЕНСТВОВАНИЕ БИОТЕХНОЛОГИИ ПРОИЗВОДСТВА ПИТАТЕЛЬНЫХ СРЕД ДЛЯ КУЛЬТИВИРОВАНИЯ ЧУМНОГО МИКРОБА НА ОСНОВЕ СЫРЬЯ ЖИВОТНОГО И РАСТИТЕЛЬНОГО ПРОИСХОЖДЕНИЯ 1010.59 KB
  Среды на основе сырья животного происхождения и их использование при культивировании чумного микроба. Разработка ускоренного способа приготовления ферментативных мясных гидролизатов. Оценка качества сред по пигменто- и индолообразованию тест-штаммов. Сравнительное изучение ростовых качеств питательных сред, приготовленных с использованием ферментативного гидролизата сои (бобов).
1489. Измерительные системы автоматизации работы железнодорожного транспорта 50.68 KB
  Внедрение современных многофункциональных и высокопроизводительных измерительных систем и мобильных комплексов (МИКАР) позволит автоматизировать многие технологические операции и, как следствие, сократить трудозатраты.
1490. Разработка схемы выпрямителя 119.13 KB
  Схема выпрямителя с П-образным LC-фильтром, номинальное напряжение нагрузки 600 Вольт, номинальная мощность 100 Ватт, допустимый коэффициент пульсации 1%, напряжение сети переменного тока 110 В при частоте 400 Гц.