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 — це два разных способу досягнення однієї і тієї ж мети: кисть не закрашує нічого. Призначення аналогічного порожнього пера описувалося в попередньому розділі. Порожні кисті мають подібне призначення. Якщо, наприклад, необхідно намалювати незаповнений круг, то перед його промальовуванням в контекст пристрою слід вибрати порожню кисть.


 

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

73671. Деталі для навівки і звивання гнучких елементів 440.5 KB
  Барабани для багатошарової навівки каната застосовуються у виняткових випадках при вельми великих довжинах навиваного каната коли при одношаровій навівки потрібен надзвичайно великі розміри барабана. У гладких барабанах завжди є бурти. Нижній шар каната при багатошаровій навівки стикається з циліндровою поверхнею барабана по лінії унаслідок чого виникають високі контактні напруги...
73672. Механізми вантажопідйомних машин 338.5 KB
  Залежно від типу вантажопідйомної машини її призначення можуть бути різні комбінації механізмів основним з яких є механізм підйому. Механізми підйому ГПМ Механізми підйому служать для вертикального переміщення вантажів. Залежно від типу приводу розрізняють механізми підйому з ручним і машинним приводом – будівельна лебідка мал.
73673. Механізми пересування 351.5 KB
  У вантажопідйомних машинах загального призначення механізми пересування по конструктивній ознаці розрізняють: а механізми пересування з ручним приводом б механізми пересування з машинним приводом електричний і ДВС. По конструкції опорноходової частини механізми пересування підрозділяються: а на рейкові б на без рейкові. За принципом роботи механізми пересування підрозділяються на дві принципові схеми: а механізми у яких переміщення здійснюється за рахунок сил зчеплення приводних ходових коліс з рейкою або грунтом б механізми у...
73674. Вимоги до антен по параметрах електромагнітної сумісності 370 KB
  Вимоги до антен по параметрах електромагнітної сумісності Розвиток супутникових систем звязку супроводжується зростаючим завантаженням діапазонів радіочастот. Передумови для рішення проблеми ЭМС створюють відомі просторова й частотна вибірковості антен. При аналізі діаграми спрямованості апертурних антен широко застосовуваних у супутниковому...
73675. Розрахунок механізму пересування з тяговим елементом 242 KB
  Ходові колеса кранів і рейки У вантажопідйомних машинах загального призначення залежно від типу машини призначення а також величини навантаження і швидкості пересування ходові колеса виготовляються сталевими і чавунними з циліндровим і конічним ободом. Як рейки у вантажопідйомних машинах застосовується квадратна або смугова сталь а також залізничні рейки
73676. Механізми повороту 471.5 KB
  Конструкція механізмів повороту визначається призначенням і конструкцією вантажопідйомної машини умовами експлуатації діючими навантаженнями і іншими особливостями крана. У вантажопідйомних машинах залежно від конструктивного виконання механізму повороту крана можуть бути дві принципово відмінні схеми приводу механізму повороту. По першій схемі прівод механізму повороту розташовується на неповоротній частині вантажопідйомної машини мал.
73677. Механізми зміни вильоту стріли 249.5 KB
  В цьому випадку приймають середню вантажопідйомність крана з перевантаженнямпо перекидаючому моменту в межах 1520 На практиці зміна вильоту стріли виробляється в двох випадках: Настановна зміна вильоту стріли. Маневрова зміна вильоту стріли. Зміна вильоту стріли виробляється в процесі роботи крана для горизонтального радіального переміщення оброблюваного вантажу.
73678. Стаціонарні поворотні крани 426 KB
  Верхня опора зміцнюється в стіні будівлі або в колоні іноді встановлюється на гнучких розтяжках при повороті крана на 360 градусів. Противага служить для зменшення перекидаючого моменту отже для полегшення опорних елементів крана зменшення ваги і розмірів фундаменту а також колони крана. Залежно від розташування наполегливого підшипника можливі дві схеми навантаження колони крана мал. Якщо ферма крана спирається на верхню шпильку колони в якій встановлений наполегливий підшипник то верхня опора сприймає не тільки горизонтальні...
73679. Двоопорні крани із змінним вильотом 325 KB
  Кран закріплюється на фундаменті, він звичайно виконується повноповоротним. В цьому випадку верхня опора зміцнюється на чотирьох розтяжках. Кран складається з двох симетричних ферм