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


 

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

45939. Классификация размерных цепей. Основные термины и определения. Метод расчета размерных цепей, обеспечивающие полную взаимозаменяемость 35.97 KB
  Размерные цепи отражают объективные размерные связи в конструкции машины технологических процессах изготовления ее детали и сборки при измерении возникающие в соответствии с условиями решаемых задач. Обозначаются размерные цепи прописными буквами русского алфавита и строчными буквами греческого алфавита кроме . Размеры образующие размерную цепь называют звеньями размерной цепи. Одно звено в размерной цепи замыкающее исходное а остальные составляющие.
45941. Назначение и виды валов и осей. Типы соединения вала с установленными на нем деталями. Технические требования к рабочим поверхностям вала. Расчет вала на прочность по напряжению изгиба и кручения 28.5 KB
  Валы в отличие от осей предназначены для передачи вращающих моментов и в большинстве случаев для поддержания вращающихся вместе с ними относительно подшипников различных деталей машин. Валы несущие на себе детали через которые передается вращающий момент воспринимают от этих деталей нагрузки и следовательно работают одновременно на изгиб и кручение. При действии на установленные на валах детали осевых нагрузок валы дополнительно работают на растяжение или сжатие. Прямые валы в зависимости от...
45942. Муфты. Виды соединительных муфт. Особенности их назначения и эксплуатации 28.5 KB
  Муфты. Муфты приводов осуществляют соединение валов концы которых подходят один к другому вплотную или разведены на небольшое расстояние причем соединение должно допускать передачу вращающего момента от одного вала к другом. Муфты приводов подразделяются на четыре класса Класс 1 нерасцепляемые муфты в которых ведущая и ведомая полумуфты соединены между собой постоянно. Класс 2 управляемые муфты позволяющие сцеплять и расцеплять ведущий и ведомый валы как во время их остановки так и во время работы на ходу.
45943. Подшипники скольжения. Виды подшипников по назначению и воспринимаемой нагрузке. Типовые элементы конструкции. Материалы вкладышей 29 KB
  В зависимости от рода трения в подшипнике различают подшипники скольжения в которых опорная поверхность оси или вала скользит по рабочей поверхности подшипника и подшипники качения в которых развивается трение качения благодаря установке шариков или роликов между опорными поверхностями оси или вала и подшипника. В зависимости от направления воспринимаемой нагрузки подшипники скольжения различают: радиальные для восприятия радиальных т. При одновременном действии на ось или вал радиальных и осевых нагрузок обычно применяют сочетание...
45944. Подшипники качения. Классификация и краткая характеристика их применяемости. Расчетная долговечность и коэффициент работоспособности 28.5 KB
  Методы регулировки зазора в подшипниках качения. Подшипники качения состоят из наружного и внутреннего колец с дорожками качения; шариков или роликов которые катятся по дорожкам качения колец; сепаратора разделяющего и направляющего шарики или ролики что обеспечивает их правильную работу. По форме тел качения различают шариковые и роликовые подшипники.
45945. Основные типы деформации деталей машин и примеры их реализации 36 KB
  Основные типы деформации деталей машин и примеры их реализации Деформация это изменение формы и размера тела после приложения внешних нагрузок. Деформация зависит от характера приложенной нагрузки. Обычно деформация кручения сопровождается другими деформациями например изгибом; 5 изгиб возникает при действии на деталь сосредоточенной или распределённой сил перпендик. Сила Ft= ; Ft деформация кручения Frизгиб балки.
45947. Чугуны: классификация, маркировка, химический состав, механические и технологические свойства, применение 23.06 KB
  Чугуны нашли широкое применение в качестве машиностроительных материалов благодаря сочетанию высоких литейных свойств достаточной прочности износостойкости а так же относительной дешевизны. Чугуны используются для производства качественных отливок сложной формы станины станков корпуса приборов и т. В зависимости от того в какой форме присутствует углерод в сплаве чугуны подразделяются на белый серый ковкий высокопрочный и легированный обладающий особыми свойствами жаропрочностью антифрикционностью и т. Белые литейные чугуны.