- •О.С. Зеленський
- •Розділ 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.4. Робота з пензликом
Приклад роботи з пензликом знаходиться у папці DISK\GDI\GDI2.
Створимо MDI програму з назвою BrushApp. Додамо у клас виду CBrushAppView функцію для обробки події натиснення лівої кнопки миші:
void CBrushAppView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen( PS_SOLID, 0, RGB(0,0,255) );
CPen* oldPen = dc.SelectObject( &pen );
CBrush* brush;
brush = new CBrush(RGB(255,0,0));
CBrush* oldBrush = dc.SelectObject( brush );
dc.Rectangle( point.x, point.y,
point.x + 40, point.y + 40 );
dc.SelectObject( oldBrush );
dc.SelectObject( oldPen );
delete brush;
CView::OnLButtonDown(nFlags, point);
}
Функція OnDraw приймає вказівку на об'єкт контексту пристрою, якого не передбачено у функції OnLButtonDown. Тому його необхідно створити самостійно рядком CClientDC dc(this). Слід сказати, що контекст класу CClientDC є незалежним контекстом клієнтського вікна та на відміну від контексту, який приходить у функцію OnDraw, дозволяє малювати тільки в межах вікна. Тобто його не можна використовувати для організації скролінгу.
Далі створюємо об'єкт олівця синього кольору pen( PS_SOLID, 0, RGB(0,0,255) ), підключаємо його до контексту. Потім створюємо об'єкт пензлика червоного кольору new CBrush(RGB(255,0,0)). Після цього малюємо прямокутник розміром 40 на 40 пікселів починаючи з координати заданою мишею при натисненні кнопки. Відключаємо пензлик і олівець від контексту. Видаляємо об'єкт пензлика через команду delete, оскільки він був створений через команду new. Отже при натисненні лівою кнопкою миші у вікні виду ми повинні отримати прямокутник червоного кольору з синьою рамкою. Щоб побачити програму у роботі необхідно її запустити та натиснути декілька разів лівою кнопкою миші у вікні виду. На рисунку 5.6 показано результат роботи, але це ще не остаточний варіант програми.
Пензлики можуть бути різних стилів. Для того щоб побачити їх можливі варіанти допрацюємо програму. Створимо вікно діалогу (рис. 5.8.) Для створення вікна діалогу необхідно створити ресурс діалогу а також клас діалогу. Ресурс діалогу створюється командою меню Insert → Resource ..., після чого з'являється вікно зі списком можливих видів ресурсів (рис. 5.7). Оберіть із списку Dialog і натисніть на кнопку New:
Рис. 5.6. Робота з пензликами, які задаються кольором
Рис. 5.7. Вікно Insert Resource
У клас діалогу додамо змінну m_nBrush, яку за допомогою майстра ClassWizard пов'яжемо із елементами управління у вигляді радіо-кнопок:
class CBrushDialog : public CDialog
{
// Construction
public:
.............................................................
int m_nBrush;
.............................................................
};
У клас виду CBrushAppView додамо змінну nBrushStyle та функцію на натиснення правої кнопки миші OnRButtonDown:
class CBrushAppView : public CView
{
.............................................................
protected:
//{{AFX_MSG(CBrushAppView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
int nBrushStyle;
};
Допрацюємо функцію OnLButtonDown для того щоб врахувати змінну nBrushStyle при малюванні прямокутників:
void CBrushAppView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen( PS_SOLID, 0, RGB(0,0,255) );
CPen* oldPen = dc.SelectObject( &pen );
CBrush* brush;
if(nBrushStyle)
brush = new CBrush(nBrushStyle - 1, RGB(0,0,0));
else
brush = new CBrush(RGB(255,0,0));
CBrush* oldBrush = dc.SelectObject( brush );
dc.Rectangle( point.x, point.y,
point.x + 40, point.y + 40 );
dc.SelectObject( oldBrush );
dc.SelectObject( oldPen );
delete brush;
CView::OnLButtonDown(nFlags, point);
}
При створенні пензлика зі стилем можна використовувати одну із наступних констант: HS_BDIAGONAL, HS_CROSS, HS_DIAGCROSS, HS_FDIAGONAL, HS_HORIZONTAL, HS_VERTICAL.
При натисненні правої кнопки миші ми будемо викликати вікно діалогу для вибору стилю пензлика. Напишемо у функцію OnRButtonDown виклик вікна діалога:
void CBrushAppView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CBrushDialog dlg;
dlg.m_nBrush = nBrushStyle;
if( dlg.DoModal() == IDOK )
nBrushStyle = dlg.m_nBrush;
CView::OnRButtonDown(nFlags, point);
}
Обраний у вікні діалогу стиль потрапляє у змінну nBrushStyle. При натиснені лівою кнопкою миші будуть малюватись прямокутники з обраним стилем. Результат роботи програми показано на рисунку 5.8:
Рис. 5.8. Робота з пензликами різних стилів