Лекції_1_ІЗВП. Коледж промислової автоматики та інформаційних технологій
Скачать 1.63 Mb.
|
void __fastcall TForm1::FormCreate(TObject *Sender) { TRichEdit *pRich = new TRichEdit(this); // The owner will clean this up. pRich->Parent = this; pRich->Align = alClient; pRich->Lines->Clear(); // set numbering style pRich->Paragraph->Numbering = nsBullet; pRich->Lines->Add("Introduction"); pRich->Lines->Add("New members to our team"); pRich->Lines->Add("New Budget discussion"); pRich->Lines->Add("Facilities"); pRich->Lines->Add("Q & A"); pRich->Paragraph->Numbering = nsNone; pRich->Paragraph->Alignment = taCenter; pRich->Lines->Add(""); pRich->Lines->Add("Suggested Topics: "); pRich->Lines->Add(""); pRich->Paragraph->Alignment = taLeftJustify; pRich->Paragraph->FirstIndent = 10; 55 pRich->Lines->Add(""); pRich->Lines->Add("Parking lot repair"); pRich->Lines->Add("Cost overruns"); } RTF це фактично ASCII файли зі спеціальними командами, які вказують відомості про форматування, наприклад, шрифту, полів і т.д. Додавання або вставка RTF з одного TRichEdit в інший Управління TRichEdit не надає методів для додавання або вставки фрагмента тексту RTF. У нього є властивість Lines, яке дозволяє додати додатковий текст, але якщо Ви захочете додати текст, який містить форматування, він буде доданий як простий текст ASCII. Якщо Ви хочете "перемістити" весь текст з одного RichEdit в інший, Ви можете використовувати потоки, але зміст одного RichEdit буде повністю переписано з RichEdit-джерела. Ось функція, яка дозволяє додавати або вставляти RTF текст з одного редактора в інший, використовуючи певні в RichEdit функції зворотного виклику: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 __fastcall TMainForm :: TMainForm ( TComponent * Owner ) : TForm ( Owner ) { unsigned mask = SendMessage ( RichEdit1 - > Handle, EM_GETEVENTMASK, 0 , 0 ) ; SendMessage ( RichEdit1 - > Handle, EM_SETEVENTMASK, 0 , mask | ENM_LINK ) ; SendMessage ( RichEdit1 - > Handle, EM_AUTOURLDETECT, true , 0 ) ; RichEdit1 - > Text = "The Bridges Publishing Web" " Site is located at [url]www.bridgespublishing.com[/url]. Check" " it out." ; } void __fastcall TMainForm :: WndProc ( Messages :: TMessage & Message ) { if ( Message. Msg == WM_NOTIFY ) { if ((( LPNMHDR ) Message. LParam ) - > code == EN_LINK ) { ENLINK * p = ( ENLINK * ) Message. LParam ; if ( p - > msg == WM_LBUTTONDOWN ) 56 26 27 28 29 30 31 32 33 34 35 36 { SendMessage ( RichEdit1 - > Handle, EM_EXSETSEL, 0 , ( LPARAM ) & ( p - > chrg )) ; ShellExecute ( Handle, "open" , RichEdit1 - > SelText. c_str () , 0 , 0 , SW_SHOWNORMAL ) ; } } } Компонент C++ Builder RichEdit-багато рядкове вікно редагування текстів в збагаченому форматі. RTF, що дозволяє проводити вибір кольору, шрифту, пошук тексту і т.д. Основною відмінною рисою RichEdit від компонента Memo, є те, що атрибути при форматуванні стануть однаковими для тексту. У вікні редагування є безліч функцій, які властиві для більшості редакторів. У ньому передбачені такі поєднання гарячих клавіш як Ctrl-V - вставити тексту позицію курсору, Ctrl-Z - скасовує останню команду Ctrl-X - вирізає виділений текст в буфер, буфер обміну, Ctrl-C - копіює виділений текст в буфер. У Властивості лінії, доступне як в періоді складання проекту, так і в періоді його виконання, є багато методів і властивостей. Властивість Текст містить у собі весь текст. Властивості часу виконання SelStart, SelText, SelLength, визначають довжину виділеного вами тексту, і сам виділений текст і позицію перед першим символом тексту який виделен.Свойство SelStart за відсутності виділеного тексту визначає положення курсору на даний момент. Ви можете задати властивість SelAttributes для того, щоб поміняти атрибути знову вводиться фрагмента тексту. Це властивість TText атрибутів, яке має під характеристики. Розмір (розмір), Color (колір), стиль (стиль) Назва (ім'я шрифту) Приклад, якщо у додатки мається RichEdit і діалог FontDialogl, то код дозволить користувачеві змінювати атрибути виділеного тексту або знову вводиться. Текст можна скоротити, типи об'єктів і SelAttributes Шрифт були сумісними, і можна присвоїти всі властивості. 57 Властивість DefAttributes, що містить в собі атрибути за замовчуванням. Атрибути діють до того часу поки не поміняються атрибути у властивості В DefAttributes значення атрибутів зберігаються. Пункт типу TParaAttributes відповідає за відступи і вирівнювання. У поточному абзаці тип Пункт володіє декількома властивостями. Число пікселів відступу нового рядка, вирівнювання-визначає вирівнювання тексту, нумерація-управління вставкою маркерів, Rightlndent-відступ від правого поля в пікселях, Leftlndent - відступ від лівого поля впікселях, TabCount - кількість позицій табуляціі.Значенія позицій табуляції в пікселах - Tab. Значення під властивостей властивості пункті необхідно задавати при натисканні небудь кнопки. ПодсвойстваParagraph відносяться до абзацу, в якому знаходиться курсор. Властивість Modified, показує чи було проведено редагування тексту у вікні. Перенесення слів, рівне правда, вказує на допустимість переносу довгих строк.Свойства ReadOnly в істинно-текст для читання. максимальна довжина для тексту, що вводиться. MaxLength = 0, означає що довжина тексту необмежена. WantTab і WantReturns визначають доступність введення в текст табуляції (TAB) і символів переведення рядка. Смуги прокрутки задає наявність смуги прокрутки тексту у вікні. Властивість може приймати ScrollBars: ssVertical, ssBoth, ssHorizontal, що означає присутність прокрутки, вертикальної горизонтального прокручування або одночасно двох смуг. 58 Змістовий модуль 1. 3 Практичне використання візуальних компонентів бібліотеки VCL Лекція №1.3.1 Тема Відображення графічної інформації. Робота з конвою Мета: ознайомитися з відображенням графічної інформації, засобами створення та роботи з зображеннями. Розглянути властивосты та методи об’єктів класу T Canvas Література 1.Б.Страуструп Программирование. Принципы и практика с использованием C++» Вильямс 2016 2. Стивен Прата Язык программирования С Вильямс 2013 3. Алекс Элайн От ламера до программера С Питер 2015 Хід заняття І. Організаційний момента) готовність групи до заняття; б) психоемоційний настрій; в) перевірка присутніх. ІІ. Актуалізація опорних знань студентів а) повідомлення теми та мети заняття; б) відповіді на запитання: Що таке RTF? Для чого використовують RTF? Особливості різних пакетів реалізації роботи з RTF в C++ Builder ІІІ. Виклад нового матеріалу План лекції 1. Відображення графічної інформації. 2. Відображення геометричних фігур 3.Формування зображень програмними засобами 4. Поняття холсту І. Узагальнення та систематизація знань. V. Підведення підсумків заняття. І. Домашнє завдання: Ознайомитись з теоретичними відомостями лекції 1.3.1 59 Вивчити основні поняття лекції Дати відповіді на контролдьні питання Контрольні питання: 1. Які є засоби роботи з графічними зображеннями? 2. Назвіть 3 основні властивості компонента Shape. 3. Що являє собою холст в програмуванні? 4. Які є методи у об’єктів класа TCanvas? Зміст лекції Полотно Програма може вивести графіку на поверхню форми (або компоненту image), якою відповідає властивість canvas (Canvas — полотно для малювання). Для того, щоб на поверхні форми або компоненту imageз'явилася лінія, коло, прямокутник або інший графічний елемент (примітив), необхідно до властивості Canvas застосувати відповідний метод (таблиця. 3.1). Наприклад, оператор Forml->canvas->rectangle(10,10,50, 50); малює на поверхні форми прямокутник. Таблиця 3.1. Методи викреслювання графічних примітивів Метод Дія Lineto(x,y) Малює лінію з поточної крапки в крапку з вказаними координатами Rectangle (x1,y1,x2, y2) Малює прямокутник, x1, y1 і х, у — координати лівого верхнього і правого ніжнего кутів прямокутника. Колір межі і внутрішньої області прямокутника можуть бути разнимі Fillrect (x1,y1,x2,y2) Малює закрашений прямокутник, x1, y1, х, у — визначають координати діагональних кутів Framerect(x1,y1,x2,y2) Малює контур прямокутника, x1, y1, х, у — визначають координати діагональних кутів Rounrect Малює прямокутник з кутами, що округляють 60 (x1,y1,x2,y2,x3,y3) Ellipse (x1,y1,x2,y2) Малює еліпс або коло (круг, x1, y1, х, у — координати прямокутника, усередині якого викреслюється еліпс або, якщо прямокутник є квадратом, коло Polyline (points, n) Малює ламану лінію points— масив типу Tpoint . Кожним елементом масиву є запис, полях і у якої містять координати точки перегину ламаної; л — кількість ланок ламаної. Метод Polylineвикреслює ламану лінію, послідовно сполучаючи прямими відрізками крапки, координати яких знаходяться в масиві: першу з другою, другу з третьою, третю з четвертою і так далі Методи виведення графічних примітивів розглядають властивість canvas як деяке абстрактне полотно, на якому вони можуть малювати (Canvas переводиться як "поверхня", "полотно для малювання"). Полотно складається з окремих крапок — пікселів. Положення піксела на поверхні полотна характеризується горизонтальною (X) і вертикальною (Y) координатами. Координати зростають зверху вниз і зліва направо (мал. 3.1). Лівий верхній піксел поверхні форми (клієнтській області) має координати (0, 0), правий ніжній — (ciientwidth, clientheight). Доступ до окремого піксела здійснюється через властивість Pixels що є двовимірним масивом, елементи якого містять інформацію про колір точок полотна. Слід звернути увагу на важливий момент. Зображення, сформоване на поверхні форми, може бути зіпсоване, наприклад, в результаті повного або часткового перекриття вікна програми іншим вікном. Тому програміст повинен поклопотатися про те, щоб у момент появи вікна програма перемальовувала зіпсоване зображення. На щастя, операційна система Windows інформує програму про необхідність перемальовування вікна, посилаючи їй відповідне повідомлення, внаслідок чого виникає подія Onpaint. Подія Onpaint виникає і у момент запуску програми, коли вікно з'являється на екрані вперше. Таким чином, інструкції, що забезпечують виведення графіки на поверхню форми, треба помістити у функцію обробки події onpaint. 61 Рис. 3.1. Координати точок поверхні форми (полотна) Олівець і кисть Методи викреслювання графічних примітивів забезпечують тільки викреслювання. Вид графічного елементу визначають властивості Реn(олівець) і Brush (кисть) тій поверхні (Canvas), на якій малює метод. Олівець і кисть, будучи властивостями об'єкту Canvas усвою чергу є об'єктами Ре і Brush. Властивості об'єкту Ріпи (таблиця. 3.2) задають колір, товщину і тип лінії або межі геометричної фігури. Властивості об'єкту Brush (таблиця. 3.3) задають колір і спосіб зафарбовування області усередині прямокутника, круга, сектора або замкнутого контура. Таблиця 3.2. Властивості об'єкту Ре (олівець) Властивість Визначає Color Колір лінії Width Товщину лінії (задається в пікселах) Style Вид лінії (pssolid— суцільна; psdash— пунктирна, довгі штрихи psdot — пунктирна, короткі штрихи psdashdot — пунктирна, чергування довгого і короткого штрихів; psdashdotdot — пунктирна, чергування одного довгого і двох коротких штрихів; psclear — лінія не відображається (використовується, якщо не треба зображати межу області — наприклад, прямокутника) Таблиця 3.3. Властивості об'єкту Brush (кисть) 62 Властивість Визначає Color Колір закрашення замкнутої області Style Стиль заповнення області (bssolid — суцільна заливка. Штрихування: bshorizontal — горизонтальна bsvertical — вертикальна bsfdiagonal — діагональна з нахилом ліній вперед bsbdiagonal — діагональна з нахилом ліній назад bscross — в клітку; bsdiagcross — діагональна клітка Нижче приведена функція обробки події onpain яка малює на поверхні форми олімпійський прапор. void__fastcall Tforml::formpaint(Tobject *Sender) { // полотнище прапора Canvas->pen->width = 1; Canvas->pen->color = clblack; Canvas->brush->color = clcream; Canvas->rectangle(30,30,150,150); Canvas->pen->width =2; // ширина кілець Canvas->brush->style = bsclear; // щоб круг, намальований // методом Ellipse, не був закрашений // малюємо кільця Canvas->pen->color = clblue; Canvas->ellipse(40,40,80,80); Canvas->pen->color = clblack; Canvas->ellipse(70,40,110,80); Canvas->pen->color = clred; Canvas->ellipse(100,40,140,80); Canvas->pen->color = clyellow; Canvas->ellipse(55,65,95,105); Canvas->pen->color = clgreen; Canvas->ellipse(85,65,125,105); } Графічні примітиви Будь-яка картинка, креслення або схема можуть розглядатися як сукупність графічних примітивів: крапок, ліній, кіл, дуг і ін. Таким чином, для того, щоб на екрані з'явилася потрібна картинка, програма повинна забезпечити викреслювання (вивід) графічних елементів — примітивів, складових цю картинку. 63 Викреслювання графічних примітивів на поверхні (форми або компоненту image — області виведення ілюстрації) здійснюється застосуванням відповідних методів до властивості canvas цій поверхні. Лінія Викреслювання прямої лінії виконує метод Lineto. Метод малює лінію з тієї крапки, в якій в даний момент знаходиться олівець (ця крапка називається поточною позицією олівця або просто "поточною, в крапку, координати якої вказані в інструкції виклику методу. Наприклад, оператор Canvas->lineto(100,200) малює лінію в крапку з координатами (100, 200), після чого поточною стає крапка з координатами (100, 200). Початкову точку лінії можна задати, перемістивши олівець в потрібну точку графічної поверхні. Зробити це можна за допомогою методу Moveto вказавши як параметри координати точки почала лінії. Наприклад, оператори Canvas->moveto(10,10); // встановити олівець в крапку (10,10) Canvas->lineto(50,10); // лінія з крапки (10,10) в крапку (50,10) малюють горизонтальну лінію з крапки (10, 10) в крапку (50, 10). Використовуючи властивість поточної крапки, можна намалювати ламану лінію. Наприклад, оператори Canvas->moveto(10,10); Canvas->lineto(50,10); Canvas->lineto(10,20); Canvas->lineto(50,20); малюють лінію, схожу на букву Z. Прямокутник Метод Rectangle викреслює прямокутник. У інструкції виклику методу треба вказати координати двох крапок — кутів прямокутника. Наприклад, оператор Canvas->rectangle(10,10,50,50) малює квадрат, лівий верхній кут якого знаходиться в крапці (10, 10), а правий ніжній в крапці (50, 50). Колір, вигляд і ширину лінії контура прямокутника визначають значення властивості Реnа колір і стиль запівки області усередині прямокутника — значення 64 властивості Brush тій поверхні, на якій метод малює прямокутник. Наприклад, наступні оператори малюють прапор Російської Федерації. Canvas->brush->color = clwhite; // колір кисті — білий Canvas->rectangle(10,10,90,30); Canvas->brush->color = clblue; // колір кисті — синій Canvas->rectangle(10,30,90,50); Canvas->brush->color = clred; // колір кисті — червоний Canvas->rectangle(10,50,90,70); Замість чотирьох параметрів — координат двох діагональних кутів прямокутника — методу Rectangle можна передати один параметр — структуру типу Trect поля якої визначають положення діагональних кутів прямокутної області. Наступний фрагмент коди демонструє використання структури Trect Як параметр методу Rectangle. Trect ret; // прямокутна область ret.Top = 10; ret.Left = 10; ret.Bottom = 50; ret.Right = 50; Canvas->rectangle(ret); // намалювати прямокутник Є ще два методи, які викреслюють прямокутник. Метод Fillrect викреслює закрашений прямокутник, використовуючи як інструмент тільки кисть (Brush), а метод Framerect — тільки контур і використовує тільки олівець (Ріпи). У цих методів тільки один параметр — структура типу Trect. Поля структури Trect містять координати прямокутної області. Значення полів структури Trect можна задати за допомогою функції Rect. Наприклад: Trect ret; // область, яку треба закрасити ret = Rect(10,10,30,50); // координати області Canvas->brush->color = clred; // колір зафарбовування Canvas->fillrect(ret); 65 Метод Roundrec викреслює прямокутник з кутами, що округляють. Інструкція виклику методу Roundrec у загальному вигляді виглядає так Canvas->roundrec(xl,yl,x2,у2,хз,уз) Параметри x1, y1, x2, y2 визначають положення кутів прямокутника, а параметри х і у — розмір еліпса, одна чверть якого використовується для викреслювання кута, що округляє (мал. 3.2). Рис. 3.2. Метод Roundrec викреслює прямокутник з кутами, що округляют Багатокутник Метод Polygon викреслює багатокутник. Інструкція виклику методу в загальному вигляді виглядає так Canvas->polygon(p,n) де р — масив записів типу Tpoint який містить координати вершин багатокутника; n — кількість вершин. Метод Polygon креслить багатокутник, сполучаючи прямими лініями крапки, координати яких знаходяться в масиві: першу з другою, другу з третьою, третю з четвертою і так далі Вид межі багатокутника визначають значення властивості Ріпи, а вид заливки області, обмеженою лінією межі, — значення властивості Brush тій поверхні, на якій метод малює. Нижче приведений фрагмент коди, яка, використовуючи метод Polygon малює ромб. Tpoint p[4]; // чотири вершини координати вершин р[0].х = 50; р[0].у = 100; р[1].х = 150; р[1].у = 75; р[2].х = 250; р[2].у = 100; 66 р[3].х = 150; р[3].у = 125; Canvas->brush->color = clred; Canvas->polygon(p,3); Коло і еліпс Намалювати еліпс або коло (окремий випадок еліпса) можна за допомогою методу Ellipse. Інструкція виклику методу в загальному вигляді виглядає таким чином у) Параметри x1, y1, x2, y2 визначають координати прямокутника, усередині якого викреслюється еліпс або, якщо прямокутник є квадратом, — коло (мал. 3.3). Рис. 3.3. Значення параметрів методу Ellipse визначають вид геометричної фігури Замість чотирьох параметрів — координат діагональних кутів прямокутника — методу Ellipse можна передати один — об'єкт типу Trect. Наступний фрагмент коди демонструє використання об'єкту Trect як параметр методу Ellipse. Trect rec = Rect(10,10,50,50); Canvas->ellipse(rec); Як і у разі викреслювання інших примітивів, вид контура еліпса (колір, товщину і стиль лінії) визначають значення властивості Реnа колір і стиль заливки області усередині еліпса — значення властивості Brush тій поверхні (canvas), на якій метод креслить. Дуга Метод Arc малює дугу — частину еліпса (кола. Інструкція виклику методу в загальному вигляді виглядає так Canvas->arc(xl,yl,х2,у 2,х3,у3, х4,у4) 67 Параметри x1, y1, х, у визначають еліпс (коло, частиною якого є дуга. Параметри х і у задають початкову, ах і у — кінцеву точку дуги. Початкова (кінцева) точка дуги — це точка перетину кордону еліпса і прямої, проведеного з центру еліпса в крапку з координатами х і уху. Метод Arc викреслює дугу проти годинникової стрілки від початкової точки до кінцевої (мал. 3.4). Колір, товщина і стиль лінії, якою викреслюється дуга, визначаються значеннями властивості Ре поверхні (canvas), на яку виконується вивід. Рис. 3.4. Значення параметрів методу Arc визначають дугу як частину еліпса (кола) Сектор Метод pie викреслює сектор еліпса або круга. Інструкція виклику методу в загальному вигляді виглядає таким чином Canvas->pie(x1,y1,х2,у2,х3,у3,х4,у4) Параметри x1, y1, x2, y2 визначають еліпс (круг, частиною якого є сектор х, ух і у — прямі — межі сектора. Початкова точка меж збігається з центром еліпса. Сектор вирізується проти годинникової стрілки від прямої, заданою точкою з координатами (худо прямої, заданою точкою з координатами (х, у) (рис. 3.5). Рис. 3.5. Значення параметрів методу Pie визначають сектор як частину еліпса кола) Текст Виведення тексту (рядків типуна поверхню графічного об'єкту забезпечує метод Textouta. Інструкція виклику методу TEXTOUTA у загальному вигляді виглядає таким чином 68 Canvas->textouta(x,y,tekct) Параметр текст задає текст, що виводиться. Параметри х і у визначають координати точки графічної поверхні, від якої виконується виведення тексту (мал. 3.6). Рис. 3.6. Координати області виведення тексту Шрифт, який використовується для виведення тексту, визначається значенням властивості Font відповідного об'єкту canvas. Властивість Font є об'єктом типу Tfont. У таблиці. 3.4 перераховані властивості об'єкту Tfontщо визначають характеристики шрифту, використовуваного методом TEXTOUTA для виведення тексту. Таблиця 3.4. Властивості об'єкту Tfont Властиві сть Визначає Name Використовуваний шрифт. Як значення слід використовувати назву шрифту (наприклад Arial) Size Розмір шрифту в пунктах (points). Пункт це одиниця вимірювання розміру шрифту, використовувана в поліграфії. Один пункт рівний 1/72 дюйми Style Стиль зображення символів. Можливо: нормальним, напівжирним, курсивним, підкресленим, перекресленим. Стиль задається за допомогою наступних констант fsbold (напівжирний) fsltalic (курсив) fsunderline (підкреслений) fsstrike out (перекреслений) Властивість style є множиною, що дозволяє комбінувати необхідні стилі. Наприклад, інструкція, яка встановлює стиль "напівжирний 69 курсив, виглядає так Canvas->font->style = Tfontstyles ( ) < Колір символів. Як значення можна використовувати константу типу Tcolor При виведенні тексту вельми корисні методи Textwidth і Textheight значеннями яких є відповідно ширина і висота області виведення тексту, які, очевидно, залежать від характеристик використовуваного шрифту. Обом цим методам як параметр передається рядок, який передбачається вивести на поверхню методом TEXTOUTA. Наступний фрагмент коди демонструє використання методів, що забезпечують виведення тексту на поверхню форми. Приведена функція обробки події Onpaint закрашує верхню половину вікна білим, ніжнюю — блакитним кольором, потім в центрі вікна, по межі закрашених областей, виводить текст (мал. 3.7). void _fastcall Tforml::formpaint(Tobject *Sender) { Ansistring ms = "Borland C++builder"; Trect arect; int x,y; // крапка, від якої буде виведений текст // верхню половину вікна фарбуємо білим arect = Rect(0,0,ClientWidth,ClientHeight/2); Canvas->brush->color = clwhite; Canvas->fillrect(arect); // нижню половину вікна фарбуємо блакитним arect = Rect(0,clientheight/2,clientwidth,clientheight); Canvas->brush->color = clskyblue; Canvas->fillrect(arect); Canvas->font->name = "Times New Roman"; Canvas->font->size = 24; // Canvas->font->style = Tfontstyles ()« fsbold « fsitalic; // текст розмістимо в центрі вікна 70 х = (Clientwidth - Canvas-xtextwidth(ms)) /2; у = Clientheight/2 - Canvas-xtextheight(ms) /2; Canvas->brush->style = bsclear; // область виведення тексту // не закрашувати Canvas->font->color = clblack; Canvas->textouta(x,y,ms); // вивести текст } Рис. 3.7. Виведення тексту Іноді потрібно вивести який-небудь текст після повідомлення, довжина якого під час розробки програми невідома. В цьому випадку необхідно знати координати правої межі області виведеного тексту. Координати правої межі тексту, виведеного методом Textoutaможна отримати, звернувшись до властивості penpos. Наступний фрагмент коди демонструє можливість виведення рядка тексту за допомогою двох інструкцій Textouta: Canvas->textouta(10,10,"borland "); |