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


 

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

39882. Разработка сайта ГОУ СПО Краснодарского торгово-экономического колледжа 11.59 MB
  При помощи сайта можно: передать всю необходимую информацию о колледже и о специальностях в том числе самые последние новости; наладить прямой контакт с абитуриентами и студентами например в форуме и с помощью блицопросов; современно разрекламировать колледж так чтобы иметь одновременно зрелищность телевизионной рекламы и информативность буклета. Таким образом целью дипломного проектирования является разработка сайта для Краснодарского торговоэкономического колледжа. Назначение и цели создания сайта В основе дипломной работы лежат...
39883. Создание Web-страниц 625.5 KB
  Объект исследования: наиболее подходящая программа для создания Webстраниц. Цель работы: создание Webстраниц. В дипломной работе выполнено: обзор программ для создания Webстраниц; сравнительный анализ Macromedia Dreamweaver и Front Page; описан процесс создания и разработки современного сайта; оценка экономической целесообразности использования персонального компьютера; правила охраны труда на рабочем месте оператора компьютерного набора и верстки. Webсайт Htmlпрограммирование ДИЗАЙН САЙТА FRONT PAGE MACROMEDIA DREAMWEAVER.
39884. Разработать принципиальную схему и текст программы контроллера на основе микропроцессора КР580 42 KB
  Алгоритмическое проектирование Процесс Основной Начало подается 0 на Селектор считывания температуры в основной камере Считывается значение температуры с Заданная температура в основной камере под 1 на Селектор считывания температуры в основной камере М1: сравнивается Заданное значение температуры в основной камере и Значение температуры в основной камере если больше то прыг на М2 иначе подается 0 на Включение основной камеры прыг на М1 М2: ожидаем 2 мин.5 часа то Авария М3: сравнивается Заданное значение температуры в морозильной...
39885. ОФОРМЛЕНИЕ ОБЯЗАТЕЛЬНЫХ УЧЕБНЫХ ДОКУМЕНТОВ 636.5 KB
  2 Примечания следует помещать непосредственно после текстового графического материала или таблицы к которым относятся эти примечания и печатать с прописной буквы с абзаца. Примечание к таблице помещают в конце таблицы над линией обозначающей окончание таблицы. Ссылки на подразделы пункты таблицы и иллюстрации не допускаются за исключением подразделов пунктов таблиц и иллюстраций данного документа Ссылка заключается в квадратные скобки [ ] содержит порядковой номер документа в СПИСКЕ ЛИТЕРАТУРЫ указание страниц. Сноски помещают с...
39886. Разработка программного обеспечения для ведения финансовой отчетности Кировской территориальной избирательной комиссии 309 KB
  Во всех территориальных избирательных комиссиях на постоянной штатной основе работают председатели в Мурманской территориальной избирательной комиссии в связи с большим числом избирателей на штатной основе работает и секретарь главные бухгалтеры. Кроме того для обеспечения передачи данных о ходе проводимых избирательных кампаний в вышестоящие избирательные комиссии председателям территориальных избирательных комиссий оперативно подчиняются системные администраторы ГАС Выборы работающие в аппарате Комиссии области. Для обеспечения...
39887. Разработать на основе МПК I8085 контроллер управления, обеспечивающий и поддерживающий определенную температуру (точность: плюс/минус 0.1 С) в холодильной камере, в зависимости от вида продукции для хранения 204.08 KB
  3 Постановка задачи4 Структурная схема устройства5 Общая схема алгоритма.6 Функциональная схема8 Детальная схема алгоритма. Структурная организация устройства Общая схема алгоритма Основная программа Х1: 1 значение с датчиков равно значению с переключателей; 0 – не равно; Х2: 1 – значение датчика больше чем значение переключателей; 0 – меньше: Рис. Общая схема алгоритма работы устройства.
39888. Прохождение практики на Предприятии ОАО «Апатит» 177.73 KB
  Служба эксплуатации контрольноизмерительных приборов и автоматики КИП и А выполняет следующие функции: метрологический надзор; техническое обслуживание; ремонт и настройку контрольноизмерительных приборов и приборов автоматического управления. Цех КИП и А выполняет такие наиболее ответственные работы как ремонт и поверка приборов эксплуатация сложных систем автоматики и др. Внедряет новые системы автоматики осуществляет техническое руководство группами эксплуатации приборов КИП и А в других цехах предприятия организует...
39889. ОПРЕДЕЛЕНИЕ РАВНОВЕСНОЙ ТЕМПЕРАТУРЫ ВОЗДУХА В ОХЛАЖДАЕМОМ ПОМЕЩЕНИИ (НА ПРИМЕРЕ НИЗКОТЕМПЕРАТУРНЫХ ПРИЛАВКОВ И ШКАФОВ) 6.31 MB
  При включении холодильной машины в охлаждаемом помещении устанавливается температура ниже температуры наружного окружающего помещение воздуха. при балансе: При наступлении равновесия между теплопритоками и теплоотводом в камере установится определенная температура называемая равновесной температурой. Не будет теплопритока от грузов и в случае если это камера длительного хранения куда грузы заложены уже давно и их температура стала равна температуре в охлаждаемом помещении. Для ограждения не подверженного действию солнечной радиации:...
39890. Бизнес-план создания ОАО «Мебель Интерьер Центр» 300.5 KB
  Расчетные данные согласно приложениям 16 показывают что предприятие в 2013 году будет иметь стабильный экономический рост: общая выручка от реализации продукции составит 14187 млн. 7663 млн. Темп роста составит 1851; объемы реализации промышленной продукции увеличатся с 45069 млн. в 2012 году до 102270 млн.