- •О.С. Зеленський
- •Розділ 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. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
Розділ 6. Друк і попередній перегляд документів
6.1. Вибір і налаштування параметрів друку
У колишні часи програмістам доводилося піклуватися про налаштування своїх програм під безліч принтерів. Тепер про це дбає операційна система Windows, в якій є драйвери майже всіх принтерів. Крім того, вона забезпечує єдиний користувацький інтерфейс для завдань, пов'язаних з друком.
Коли в Windows-додатку вибирають команду Print з меню File, на екрані з'являється стандартне діалогове вікно Print (рис. 6.1).
Рис. 6.1. Стандартне діалогове вікно Print
А якщо з меню File вибрати команду Print Setup (настройка друку), відкривається стандартне діалогове вікно Print Setup (рис. 6.2).
6.2. Створення контекста пристрою
Контекст пристрою являє собою структуру даних, визначену у операційній системі Windows і містить інформацію про набір графічних об'єктів та пов'язаних з ними атрибутами цих пристроїв, а також про графічні режими виведення інформації. Під графічними об'єктами маються на увазі олівці для малювання ліній, пензлі для зафарбовування замкнутих контурів, бітові образи для виведення на екран або прокручування зображення у вікні, палітри, що визначають набір доступних кольорів, регіони для усікання зображення і подібних операцій, а також шляхи для операцій малювання.
Рис. 6.2. Стандартне діалогове вікно Print Setup
В процесі друку програма виводить стандартне діалогове вікно з інформацією про стан принтера (рис. 6.3).
Рис. 6.3. Стандартне вікно, що інформує про стан принтера
Відображення всієї інформації в Windows може здійснюватися тільки з використанням об'єктів класів контексту пристроїв, які містять методи Windows API, що реалізують малювання ліній, форм та виведення тексту. Використання контексту пристрою дозволяє здійснювати незалежне від пристрою виведення графічної інформації в Windows. З його допомогою графічна інформація може бути виведена на екран, на принтер або в метафайл.
У класі CPaintDC реалізовані основні принципи роботи з контекстом пристроїв Windows. Конструктор даного класу викликає функцію CWnd::BeginPaint, а його деструктор викликає функцію CWnd::EndPaint. При виклику функції CView::OnDraw додаток викликає функцію CView::OnPrepareDC і передає користувачеві вказівку на об'єкт класу CDC. Знищення цього об'єкту додаток також бере на себе.
Клас CClientDC містить методи, що дозволяють працювати тільки в робочій області вікна. Конструктор даного класу викликає функцію CWnd::GetDC, а його деструктор – функцію CWnd::ReleaseDC. Більшість процедур малювання розташовується у функціях OnDraw, викликаються при створенні вікна і при необхідності його перемальовування. Проте в деяких випадках потрібно вивести в вікно деякий графічний об'єкт, не вдаючись до повного або часткового перемальовування вікна. Саме в цьому випадку і слід використовувати для завдання контексту пристрою об'єкт класу CClientDC.
Клас CWindowDC містить методи, що дозволяють працювати з усім вікном, включаючи його рамку. Клас CMetaFileDC містить методи, які дозволяють зберігати графічні об'єкти в метафайлах. На відміну від класу CPaintDC, вказівка на який передається у функції OnDraw, даний клас не викликає функцію OnPrepareDC і її виклик повинен здійснювати користувач.
Як вже зазначалося раніше, майже всі операції малювання в додатку здійснюються функцією OnDraw, яка перевантажується у кожному похідному від неї класі. У перевантаженій функції OnDraw необхідно зробити наступні дії:
• отримати дані з документа, який пов’язаний з даним видом;
• вивести ці дані в графічному вигляді з використанням об'єкта класу контексту пристрою, вказівка на який передається даній функції в якості параметру.
У разі внесення будь-яких змін в дані, що містяться в документі, ці зміни повинні бути негайно відображені на екрані. Зазвичай всі зміни вносяться в документ через пов'язаний з ним об'єкт класу виду. Якщо з даним документом пов'язані кілька об'єктів виду, то для внесення змін в усі ці об'єкти клас виду, через який вносяться зміни, отримує вказівку на пов'язаний з ним об'єкт документа і викликає функцію CDocument::UpdateAllViews, що має три аргументи, першим з яких є вказівка на об'єкт класу CView, в якому відбулися зміни, що викликали модифікацію документа. Якщо перший аргумент даної функції дорівнює нулю, то необхідно внести зміни в усі об'єкти виду. Другий параметр функції UpdateAllViews має тип LPARAM і містить інформацію про необхідні зміни. Третій параметр даної функції є вказівкою на об'єкт класу CObject, в якому також зберігається інформація про необхідні зміни.
Ця функція, звичайно, викликається після внесення змін у документ і після виклику функції CDocument::SetModifiedFlag. Функція UpdateAllViews посилає повідомлення всім об'єктам класів виду, за винятком об'єкта на який вказує перший аргумент даної функції, про внесення змін до пов'язаного з ним документу. Для цього вона викликає функцію CView::OnUpdate, що має той же набір аргументів, що і викликаюча функція.
Як тільки вікно виду отримує повідомлення про необхідність перемальовування, Windows надсилає повідомлення WM_PAINT. У класі виду є функція обробки даного повідомлення CWnd::OnPaint, яка створює об'єкт класу контексту пристроїв CPaintDC і викликає функцію OnDraw даного класу виду. Зазвичай користувач повинен перевантажувати функцію OnPaint.
Типовий приклад перевантаженої функції OnDraw наведено нижче.
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
CString s = pDoc->szDemoString;
CRect rect;
GetClientRect(&rect);
pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
pDC->TextOut(rect.right / 2, rect.bottom / 2,
s, s.GetLength());
}
У даному прикладі додаток отримує вказівку на об'єкт документа, пов'язаного з даним вікном виду. Потім, використовуючи отриману вказівку на об'єкт класу документа, дана функція отримує доступ до змінної – члену класу документа szDemoString. Після цього отриманий з документа рядок виводиться посередині екрану. Якщо дана функція здійснює виведення на екран, то передана їй вказівка на об'єкт класу CDC у дійсності є вказівкою на об'єкт класу CPaintDC, для якого вже викликана функція BeginPaint. Для виконання функцій роботи з графічними об'єктами використовуються методи відповідного класу контексту пристрою.