пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Вирішення проблем перемальовування зображень у MFC. Концепція віртуального вікна.

Під час виведення графіки, тексту та подальших операцій з вікном відбувається втрата інформації. Наприклад, якщо вивести растрове зображення у вікно, а потім вікно мінімізувати та наново максимізувати, відбудеться втрата зображення. Те саме відбувається із текстом.

Яким чином можна вирішити проблему оновлення вікна? Пропонується три методи :

1)      увесь час обраховувати координати тексту та зображень;

2)      зберігати запис подій, пов’язаних із виведенням інформації у вікно та, за необхідності, “перегравати” події;

3)      підтримувати у програмі “віртуальне вікно”, яке зберігатиме копію     усього графічного виведення у пам’яті та копіювати його зміст у реальне (“фізичне”) вікно при отриманні повідомлення WM_PAINT.

Третій метод є найбільш обґрунтованим. Саме він використовується в операційній системі Windows.

Для забезпечення функціонування віртуального вікна у програмі необхідно виконати ряд дій. Спочатку необхідно створити контекст області пам’яті, сумісний із контекстом вікна програми. Після цього все виведення направляється через контекст області пам’яті. Щоразу, коли прийматиметься повідомлення WM_PAINT, вміст контексту області пам’яті має копіюватися у контекст вікна та відображатися на екрані. Якщо все виведення направлятиметься черех пам’ять, програма завжди матиме запис поточного вмісту фізичного вікна.

Під час реалізації віртуального вікна використовується декілька функцій.

Створення сумісного контексту забезпечує функція CreateCompati-bleDC():

virtual BOOL СDC::CreateCompatibleDC( CDC* pDC );

Обирання об’єктів у контекст пристрою – функція SelectOblect():

CPen* СDC::SelectObject( CPen* pPen );

CBrush* СDC::SelectObject( CBrush* pBrush );

virtual CFont* СDC::SelectObject( CFont* pFont );

CBitmap* СDC::SelectObject( CBitmap* pBitmap );

int СDC::SelectObject( CRgn* pRgn );

 

Створення растрового зображення, сумісного із контекстом пристрою, забезпечує функція CreateCompatibleBitmap():

BOOL CBitmap::CreateCompatibleBitmap( CDC* pDC, int nWidth, int nHeight );

Тут параметрами є: pDC – покажчик на контекст пристрою, до якого створюється сумісне зображення, nWidth та nHeight відповідно ширина та висота растрового зображення. Растрове зображення є необхідним для фізичного зберігання інформації, яка виводиться у віртуальне вікно.

Віртуальне вікно заповнюється тим самим фоном, що й фізичне вікно. Для такої сумісності растрове зображення, відповідне віртуальному вікну, заповнюється функцією PatBlt(), яка заповнює прямокутну область відповідно до кольору та стилю поточного пензля.

BOOL СDC::PatBlt( int x, int y, int nWidth, int nHeight, DWORD dwRop );

Тут параметрами є: (x,y) – координата верхнього лівого кута вікна, Width та Height – ширина та висота прямокутної області заповнення, dwRop – спосіб заповнення.

Для організації віртуального вікна необхідно:

1.       У класі вікна оголосити об’єкт контексту пристрою віртуального ві-кна; об’єкт растрового зображення, відповідно віртуальному вікну; об’єкт пензля заповнення віртуального вікна.

Це може виглядати так:

 class CMainWin::CFrameWnd

[public:

CDC  memDC;                // контекст пристрою віртуального вікна;

CBitmap  vbmp;               // растрове зображення віртуального вікна;

CBrush  mbrush;              // пензель для заповнення віртуального вікна;

];

2.       У конструкторі головного вікна програми здійснити такі зміни:

?        отримати розміри фізичного вікна програми;

?        реалізувати сумісність контексту віртуального вікна з фізичним вік-ном;

?        створити растрове зображення, сумісне з основним вікном програми та обрати його у контекст віртуального вікна;

?        створити фон віртуального вікна (зазвичай – білого кольору), зробити його поточним та обрати у контекст віртуального вікна, заповнити обраним фоном віртуальне вікно.  Зазначені зміни ілюструє приклад 4.7.

3.       В обробнику повідомлення WM_PAINT здійснити копіювання вмісту віртуального вікна у фізичне вікно програми


21.06.2015; 22:43
хиты: 72
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь