- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
5.3. Робота з пензликами та малювання графічних фігур
Роботу з пензликами та малюванням фігур розглянемо на основі попередньої програми У функції OnDraw є режими малювання при kod_graf==1 та kod_graf==2:
void CGrafView::OnDraw(CDC* pDC)
{
CGrafDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CPen pen;
CPen* pen_st;
.............................................................
CRect rect;
GetClientRect(&rect);
if(kod_graf==1)
{
pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
pen_st = pDC->SelectObject(&pen);
pDC->MoveTo(0,0);
pDC->LineTo(rect.right,rect.bottom);
pen.DeleteObject();
pen.CreatePen(PS_SOLID,3,RGB(0,0,255));
pDC->SelectObject(&pen);
pDC->MoveTo(rect.right,0);
pDC->LineTo(0,rect.bottom);
pen.DeleteObject();
pen.CreatePen(PS_DASH,1,RGB(0,255,255));
pDC->SelectObject(&pen);
pDC->MoveTo(0,rect.bottom/2);
pDC->LineTo(rect.right,rect.bottom/2);
pen.DeleteObject();
pen.CreatePen(PS_DOT,1,RGB(255,0,255));
pDC->SelectObject(&pen);
pDC->MoveTo(rect.right/2,0);
pDC->LineTo(rect.right/2,rect.bottom);
pDC->SelectObject(pen_st);
}
if(kod_graf==2)
{
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
pen_st = pDC->SelectObject(&pen);
br.CreateSolidBrush(RGB(255,0,0));
br_st = pDC->SelectObject(&br);
rect.InflateRect(-rect.right/8,-rect.bottom/8);
pDC->Rectangle(&rect);
br.DeleteObject();
br.CreateSolidBrush(RGB(0,255,0));
pDC->SelectObject(&br);
rect.InflateRect(-rect.right/8,-rect.bottom/8);
pDC->Rectangle(&rect);
br.DeleteObject();
br.CreateSolidBrush(RGB(0,0,255));
pDC->SelectObject(&br);
rect.InflateRect(-rect.right/8,-rect.bottom/8);
pDC->Ellipse(&rect);
pDC->SelectObject(pen_st);
pDC->SelectObject(br_st);
}
.............................................................
}
У випадку при kod_graf==1 ми малюємо 4 лінії. Функція CreatePen класу CPen створює об'єкт олівця. Конструктор олівця приймає три параметра: стиль лінії (див. табл. 5.1), товщина лінії, колір. У графічних контекстах Windows є обмеження – при товщині лінії більше ніж 1 піксель стиль може бути тільки PS_SOLID (суцільна лінія).
Таблиця 5.1
Стилі ліній для створенння олівця
Стиль лінії |
Опис |
PS_SOLID |
Сплошна |
PS_DASH |
Штрихова |
PS_DOT |
Пунктирна |
PS_DASHDOT |
Штрих-пунктирна, одна точка на одну лінію |
PS_DASHDOTDOT |
Штрих-пунктирна, дві точки на одну лінію |
PS_NULL |
Невидима |
PS_INSIDEFRAME |
Лінія, предназначена для обводки замкнутих фігур |
Функція SelectObject класу CDC завантажує олівець до контексту вікна. У змінну pen_st записується старе значення олівця. Функція MoveTo встановлює першу координату для малювання лінії, при цьому нічого не малюється. Виведення ліній здійснює функція LineTo. В ній задається координата до якої повинна бути проведена лінія. Після проведення лінії координати точки для початку виведення встановлені функцією MoveTo змінюються на координати задані у LineTo. Якщо декілька разів викликати функцію LineTo з різними координатами то в результаті буде намальована ломана лінія. Графічні функції для роботи з контекстом містяться в бібліотеці gdi32.lib. Функція DeleteObject класу CPen видаляє об'єкт олівця з пам'яті. Результат роботи приведено на рисунку 5.4.
Рис. 5.4. Малювання ліній з використанням олівця
При kod_graf==2 малюються графічні фігури – прямокутники та еліпс. Функція CreateSolidBrush створює об'єкт пензлика. Функція SelectObject класу CDC завантажує пензлик до контексту вікна. У змінну br_st записується старе значення пензлика. Функція InflateRect класу CRect збільшує або зменшує розміри прямокутника в залежності від заданих параметрів. При заданні від'ємних значень прямокутник зменшується, додатних значень – збільшується. Функція Rectangle класу CDC малює прямокутник використовуючи координати об'єкта типу CRect або можна задати координати окремими параметрами. Заливка прямокутника та його обводення у даній функції не задається тому що вони беруться із заздалегідь підключених до контексту об'єктів пензлика та олівця. Функція Ellipse приймає такі ж самі параметри як і Rectangle але малює овал вписаний у заданні координати. Функція DeleteObject класу CBrush видаляє об'єкт пензлика з пам'яті. Результат роботи приведений на рисунку 5.5.
Рис. 5.5. Малювання геометричних фігур з використанням олівця та пензликів