Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

Розділ 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. Для виконання функцій роботи з графічними об'єктами використовуються методи відповідного класу контексту пристрою.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]