Читайте также:
|
|
В більшості випадків Windows управляє пристроями за допомогою спеціальних програм – драйверів. Драйвери приймають інформацію від додатку і передають відповідно цій інформації дані конкретному пристрою – монітору, принтеру, іншому пристрою виводу.
Оскільки пристрої виводу інформації навіть одного класу (наприклад, монітори) сильно відрізняються по характеристиках відображення, на плечі драйвера лягає постобробка інформації – пристосування відображення до можливостей пристрою, що використовується. Драйвер зв'язується з додатком за допомогою спеціальної структури даних, званої контекстом пристрою.
Контекст пристрою – це не більше ніж структура C++, яка містить атрибути робочого поля вікна. Ці атрибути включають вибране для поточної операції перо, кисть і шрифт.
Робоча область вікна – частина поверхні екрану, в якій можна відображати все, що порахує потрібним додаток: текст, таблиці даних, картинку і т.д. Певну допомогу в цьому надає бібліотека MFC, яка інкапсулює функції графічного інтерфейсу Windows в свої класи контексту пристроїв.
Шрифти
Шрифти Windows описуються в структурі LOGFONT. Структура містить в собі 14 полів:
· lfHeight — висота шрифта, логічних одиниць;
· lfWidth — ширина шрифта, логічних одиниць;
· lfEscapement — угол нанесення тексту;
· lfOrientation — наклон символів;
· lfWeight — товщина ліній шрифта;
· lfItalic — ненульове значення означє курсив;
· lfUnderline — ненульове значення означає підкреслення;
· lfStrikeOut — ненулевое значение означає перекреслений щрифт;
· lfCharSet — номер таблиці кодування;
· lfOutPrecision — параметр, що визначає відповідність шрифту, що тапрошується і того, що є в наявності;
· lfClipPrecision — параметр, що визначає спосіб "обрізання" зображень літер при их виході за межі області обмеженого виводу;
· lfQuality — якість вигляду шрифта;
· lfPitchAndFamily — поле визначає, чи буде шрифт мати фіксовану або змінну ширину літер, а також сімейство, до якого належить шрифт;
· lfFaceName — им’я шрифта.
При програмуванні під Windows прийнято при створенні нового шрифту і виборі його в контекст зберігати покажчик на старий. Як це робиться, буде показано в ході роботи.
3.2 Хід виконання роботи
3.2.1 Заготівка додатку
Перш за все необхідно розробити додаток для роботи з єдиним документом, назвемо його TestPaint. В процесі створення додатку за допомогою майстра створення додатків не міняємо ніяких опцій, окрім етапу вибору опцій зовнішнього вигляду документа, де скидаємо всі прапорці (рис. 3.1 та Рисунок 3.1)
Рисунок 3.1 – Етап вибору опцій зовнішнього вигляду документа у Microsoft Visual Studio 2005
Для з'ясування механізму виводу на екран дана програма повинна буде по натисненню лівою кнопкою миші на робочій області міняти вміст вікна виводу.
Спершу необхідно включити в клас уявлення новий член-змінну, який буде берегти інформацію про те, який вид картинки потрібно вивести на екран, і змінювати її у відповідь на кожне клацання мишею.
За допомогою оглядача файлів, який знаходиться в робочому вікні проекту справа вибираємо теку Header Files і в ній вибираємо і відкриваємо файл TestPaintView.h. Після коментарія //Attribute додаємо в тіло класу наступні строчки:
protected:
enum {Fonts, Pens} m_Display;
Переходимо в оглядач класів, розвертаємо вміст класу CTestPaintView і двічі клацаємо на конструкторі класу CTestPaintView(). Додаємо в тіло конструктора наступний рядок:
m_Display = Fonts;
Таким чином спочатку, при запуску програми, селектор картинок ініціалізується на відображення набору шрифтів.
Тепер переходимо до доповнення функції OnDraw(CDC* pDC), в якій буде використовуватися наш селектор картинок.
Двічі клацаємо на ім'я цієї функції і вставляємо в неї текст, який буде відповідати за перемикання між зображеннями (лістинг 3.1).
void CTestPaintView::OnDraw(CDC* pDC)
{
CTestPaintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
switch (m_Display)
{
case Fonts:
ShowFonts(pDC);
break;
case Pens:
ShowPens(pDC);
break;
}}
Лістинг 3.1 – Модіфікована функція зміни зображення
Зараз необхідно додати в клас CTestPaintView функції ShowFonts(pDC) і ShowPens(pDC). Кожна з цих функцій використовує той же покажчик контексту, який був переданий функції OnDraw(CDC* pDC). Включити ці функції в клас можна таким чином:
а) клацніть правою кнопкою миші на назві класу CTestPaintView і в меню вибрати пункт додавання функції-члена Add Member Function;
б) в полі Fuction Type введіть тип, що повертається функцією - значення void; Оголошення функції Function Declaration повинне мати вигляд ShowFonts(CDC* pDC); змініть характер доступу на захищений – виберіть перемикач Protected; клацніть на кнопку [OK];
3. повторіть вище перелічені дії, тільки замість ShowFonts(CDC* pDC) введіть в полі оголошення функції значення ShowPens(CDC* pDC).
Тепер необхідно відловити клацання лівої кнопки миші і написати текст обробки повідомлення, в якій повинна відбутися зміна змінної m_Display. Клацніть правою кнопкою миші на назві класу CTestPaintView і виберіть пункт додавання обробника повідомлень Add>New>Message Handler, тепер вибираємо і двічі клацаємо на обробнику WM_LBUTTONDOWN в списку обробників нових повідомлень і подій Windows New Windows Message and Event Handlers (рис. 3.3), клацаємо на кнопці [Edit Existing] і переходимо до редагування створеної функції обробки повідомлень.
В створену функцію обробки повідомлень необхідно вставити текст, представлений в лістингу 3.2. Задача даної функції привласнити нове значення змінної m_Display і викликати функцію Invalidate(). Виклик функції Invalidate() говорить ОС, що весь вміст вікна потрібно перемальовувати. Це примушує Windows сформувати повідомлення WM_PAINT, яке, у свою чергу, викликає функцію OnDraw(CDC* pDC), яка залежно від значення змінної m_Display викличе відповідну функцію промальовування зображення.
Рисунок 3.2 – Додавання функції обробки повідомлення
void CTestPaintView::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_Display == Fonts)
m_Display = Pens;
else
m_Display = Fonts;
Invalidate();
CView::OnLButtonDown(nFlags, point);
}
Лістинг 3.2 – Текст функції обробки повідомлення
3.2.2 Розробка функцій виводу тексту і графічних примітивів
Тепер необхідно написати власне функції формування даних для виводу на екран. Почнемо з функції ShowFonts(CDC* pDC).
void CTestPaintView::ShowFonts(CDC *pDC)
{
LOGFONT myfont;
myfont.lfHeight = 8;
myfont.lfWidth = 0;
myfont.lfEscapement = 0;
myfont.lfOrientation = 0;
myfont.lfWeight = FW_NORMAL;
myfont.lfItalic = 0;
myfont.lfUnderline = 0;
myfont.lfStrikeOut = 0;
myfont.lfCharSet = ANSI_CHARSET;
myfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
myfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
myfont.lfQuality = PROOF_QUALITY;
myfont.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
strcpy(myfont.lfFaceName, "Times New Roman");
UINT pos = 0;
UINT i;
for (i=0; i<8; i++)
{
myfont.lfHeight = 8 + (i*8);
if (i==5) myfont.lfItalic = 1;
if (i==6) myfont.lfUnderline = 1;
if (i==7) myfont.lfStrikeOut = 1;
CFont font;
font.CreateFontIndirect(&myfont);
CFont* oldfont = pDC->SelectObject(&font);
pos += myfont.lfHeight;
pDC->TextOut(20, pos, "sample font...");
pDC->SelectObject(oldfont);
}
}
Лістинг 3.3 – Текст функції виводу шрифтів
Функція починає з того, що встановлює шрифт Times New Roman заввишки 8 пікселів шириною, яка найкращим чином відповідає висоті (лістинг 3.2). Потім в циклі послідовно збільшує висоту шрифту, що виводиться, і, починаючи з п'ятого рядка додає шрифту додаткові атрибути: курсив, підкреслення, перекреслювання (рис 3.3). Після установки атрибутів функція створює новий шрифт – екземпляр класу CFont і настроює шрифт відповідно до заданих параметрів. Потім створюється покажчик на поточний шрифт, який після виводу на екран чергового рядка встановлюється як поточний контекст.
Тепер відкомпілюйте і відтранслюйте додаток. Після запуску виконуваного файла ви побачите декілька рядків тексту, що поступово збільшуються за розміром. Клацніть на вікні лівою кнопкою миші і фон стане чистим – це тому, що функція ShowPens(CDC* pDC) ще нічого не робить. Клацнувши ще раз, отримаємо знову зображення тексту.
Рисунок 3.3 – Результати роботи програми: функція виводу тексту
Тепер перейдемо до функції ShowPens(CDC* pDC). Створення цієї функції набагато простіше попередньої, оскільки тут вимагається задати тільки стиль зображення лінії, її товщину і колір.
void CTestPaintView::ShowPens(CDC *pDC)
{
srand(time(NULL));
UINT pos = 10;
UINT i;
for (i=0; i<16; ++i){
CPen pen(PS_SOLID, i*2+1, RGB(rand()%256,rand()%256,rand()%256));
CPen* oldpen = pDC->SelectObject(&pen);
pos += i*2+10;
pDC->MoveTo(20,pos);
pDC->LineTo(400,pos);
pDC->SelectObject(oldpen);
}
}
Лістинг 3.4 – Текст функції виводу ліній
Функція в тілі циклу спочатку формує нове перо – екземпляр класу CPen. Конструктору необхідно передати три параметри: стиль лінії, товщина лінії, яка збільшується в кожному подальшому циклі, і колір лінії (генерується випадковим чином). Макрос RGB приймає три значення для червоної, зеленої і синьої складових і перетворить їх в код кольору. Як і у випадку з шрифтами в циклі створюється покажчик на поточне перо, яке потім відновлюється в контексті. Після запуску програми функція виведе у вікні 16 ліній товщини, що поступово збільшується, і довільного кольору (рис. 3.4).
Спробуйте самостійно міняти різні параметри шрифтів і ліній і виводити їх на екран.
Рисунок 3.4 – Результати роботи програми: функція виводу ліній
3.3 Завдання до лабораторної роботи
3.3.1 Створити додаток згідно з вказівками.
3.3.2 Змінити текст, що виводиться, на текст, написаний українською мовою.
3.3.3 Змінити функцію виводу ліній таким чином, щоб усі лінії були однакової товщини.
3.4 Контрольні питання
3.4.1 Чим відрізняються растровий та векторний типи шрифтів?
3.4.2 Якою процедурою можна встановити потрібний шрифт?
Дата добавления: 2015-12-08; просмотров: 107 | Нарушение авторских прав