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

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

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