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


 

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

39925. Що таке WEB 2.0 350.5 KB
  0 Усього лише декілька років тому цього терміну не існувало в природі зараз пошукова система Google видає мільйони посилань на документи де згадується поняття Web 2. Він пророчив WiFi пошукову систему Google і книжковий магазин mzon при цьому студенти які зробили Yhoo пропонували купити у них цей сайт за мільйон але О'Рейллі поскупився. Google Ще недавно це була просто фантастична success story і саме яскраве досягнення доткоміндустрії а зараз взагалі невідомо як до неї ставитися: ще трохи і Google все охопить. Google випустив...
39926. СЕМАНТИЧНИЙ ВЕБ 122 KB
  Тому подальший розвиток Internet багато вчених повязують з концепцією Семантичного Web Semntic Web яка багато в чому завдяки уніфікації обміну даними імовірно дасть можливість інтегрувати в Internet навіть обєкти реального світу Концепцію Семантичного Web висунув Тім БернерсЛі один з основоположників World Wide Web і голова консорціуму W3C на міжнародній конференції XML2000 що відбулася у 2000 році у Вашингтоні. В процесі реалізації концепції Семантичного Web отримали широкий розвиток синтаксичні методи представлення інформації...
39927. Соціальні мережі 100.5 KB
  З цієї зачатковою нейромережі виріс колосальний коллаборативный інтерфейс обєднуючий всю цивілізацію механізм здібний до пізнання і відчуття могутніший ніж всі попередні винаходи. Але не тільки: Інтернет виступив майданчиком на якому люди об'єднані в тісні взаємодіючі мережі змогли користуючись лише віртуальними сервісами змінити реальність. Іншими словами віртуальне нарешті вийшло за межі комп'ютерної мережі і стало реальним знайшло відчутні риси політичну потужність здатну управляти реальністю.
39928. Блог 235.5 KB
  Підтримка російського WordPress. Тут ви знайдете найсвіжішу версію російського WordPress. Форум підтримки російського WordPress. Розсилка Використовуєм WordPress для створення свого сайту .
39929. Вікіпедія – модель обміну знаннями 48.5 KB
  Проте ситуація склалася набагато краще причому не тільки для окремо узятої Вікіпедії але і для модного тренда в цілому.0 то завжди називають вікі – це один з його елементів. Кінець 80 – х років минулого століття вважають початком розробки першої в світі вікітобто тоді коли Каннінгем працював над проектом HyperCrd.
39930. НОВИННІ ІНФОРМАЦІЙНІ ПОТОКИ В ІНТЕРНЕТ 45.5 KB
  Найпоширеніший формат отримав назву RSS що означає Relly Simple Syndiction Rich Site Summry хоча спочатку він називався RDF Site Summry. Спочатку RSS створювався компанією Netscpe для порталу Netcenter як один з перших XMLдодатків але потім став використовуватися на багатьох інших сайтах. Живі журнали що працюють в Інтернет використовують RSS як інструменту оперативного представлення своїх оновлень. Специфікації окремих версій формату RSS приведені на таких Webсторінках: RSS 0.
39931. Загальна характеристика масовоінформаційної діяльності 144.5 KB
  Професіональної а не професійної тобто комунікації яка відбувається не у певній професійній сфері а на високому рівні майстерно як належить професіоналові знавцю правил спілкування й мовлення. Отже передбачається що ви після вивчення цієї дисципліни та багатьох інших протягом 45 років маєте стати висококваліфікованими фахівцями з питань масової комунікації. Як бачимо ідея єдності об єднання зв язку зі спільнотою є визначальною для поняття комунікації або спілкування.
39932. ПРАВОВІ ЗАСАДИ ДІЯЛЬНОСТІ УКРАЇНСЬКИХ МАС-МЕДІА 142.5 KB
  Нормою стали дотації і спонсорські вкладення у ЗМІ за так зване інформаційне забезпечення ангажованість видань і телерадіопрограм порушення етичних норм серед журналістів. Основна частина населення країни близька до того що незабаром буде позбавлена доступу до друкованого слова а отже і до інформації про соціальноекономічне політичне і духовне життя України про події за рубежем. Крім того у декларації зазначається що “згідно зі ст. 19 Загальної декларації прав людини започаткування підтримка та зміцнення незалежної...
39933. ПСИХОЛОГІЧНІ ОСОБЛИВОСТІ ДІЯЛЬНОСТІ ЗАСОБІВ МАСОВОЇ ІНФОРМАЦІЇ 55.5 KB
  Суспільство здебільшого набирає рис постіндустріального інформаційного а оскільки історія людства крім всього іншого є історією боротьби за владу панування то в контексті нинішньої ситуації влада опиняється в руках тих хто має доступ до інформації ідентифікації внутрішнього світу людини й змістових картин. Під засобами масової інформації далі – ЗМІ розуміють газети журнали теле і радіопрограми кінодокументалістику інформаційні агенції інші періодичні форми публічного розповсюдження масової інформації. Зрозуміло що діяльність ЗМІ...