Повідомлення WMPAINT і його обробка

Якщо вікно переміщається по екрану за допомогою клавіатури або миші, то збереження в незмінному вигляді вмісту клієнтської області вікна забезпечують системні програми Якщо частина вікна затуляється при розгортанні пунктів меню, то тимчасово закриту область ОС також зберігає сама і потім відновлює Якщо ж необхідно розгорнути згорнуте вікно, або розтягнути вікно, або на тлі головного вікна переміщається дочірнє, то Windows вже не перемальовує все вікно, а посилає самому додатком повідомлення WMPAINT Додаток, отримавши це повідомлення, має перемалювати вміст клієнтської області вікна, вміст же заголовка вікна перемальовує Windows Обробка WMPAINT включається у віконну функцію будь-якого додатку, яке-небудь виводить на екран, Додаток може саме інформувати Windows, що йому потрібно послати повідомлення WMPAINT Це здійснюється з використанням функцій InvalidateRect, InvalidateRgn, UpdateWindow In-validateRect оголошує задану прямокутну область вікна пошкодженої, що призводить до генерації Windows повідомлення WMPAINT UpdateWindow передає WMPAINT безпосередньо у віконну функцію

Розглянемо класичний алгоритм обробки у віконній функції повідомлення WMPAINT:

1) Отримати у системи контекст пристрою для вікна Для цього викликається функція BeginPaint, що має два параметри Перший-це дескриптор вікна, в який буде направлений виведення зображення Другий параметр це адреса структури PAINTSTRUCT, яку BeginPaint заповнює даними Опис PAINTSTRUCT для MASM32 знаходиться в windowsinc, а для С в winuserh

PAINTSTRUCT STRUCT
hDC    DWORD
дескриптор виділяється контексту пристрою

fErase DWORD прапор перемальовування фону вікна

rcPaint RECT <> область вирізки

fRestore DWORD зарезервовано flncUpdate DWORD зарезервовано

rgbReserved BYTE 32 dup () зарезервовано PAINTSTRUCT ENDS

Розглянемо поля структури Якщо при заповненні структури WNDCLASS не поставити кисть для зафарбовування фону вікна, то функція BeginPaint встановить прапор перемальовування вікна ненульовим Це означає, що додаток повинно саме зафарбовувати фон вікна, інакше воно буде прозорим Цей режим практично не використовується, і при завданні кисті прапор перемальовування фону встановлюється рівним нулю Область вирізки являє собою структуру RECT, описує прямокутну область, яку необхідно перемалювати:

RECT STRUCT

left dd Х-координата лівого верхнього кута
top       dd Y-координата лівого верхнього кута

right dd Х-координата правого нижнього кута bottom dd Y-координата правого нижнього кута RECT ENDS

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

Функція BeginPaint повертає дескриптор контексту монітора для клієнтської області вікна

2) Встановити свої режими малювання або характеристики інструментів і сформувати цільове зображення за допомогою функцій GDI, що вимагають контекст в якості одного з параметрів

3)&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp За допомогою виклику функції EndPaint повернути Windows контекст пристрою, повернувши його в початковий стан Параметри EndPaint ті ж, що і у BeginPaint

У програмі на MASM32 це реалізується наступним чином:

include \masm32\include\gdi32inc includelib \masm32\lib\gdi32lib

У WndProc:

LOCAL hDC  :DWORD LOCAL Ps   :PAINTSTRUCT

.if Msg = WM_PAINT

invoke BeginPaint,hWin,ADDR Ps

mov hDC, eax invoke Paint_Proc,hWin,hDC invoke EndPaint,hWin,ADDR Ps

Якщо контекст монітора необхідний поза обробки WMPAINT, то його можна отримати функцією GetDC (Для клієнтської області вікна) або GetWindowDC (Для всього вікна), а звільнити функцією Re-leaseDC Контекст, отриманий за допомогою GetDC, дозволяє працювати не з регіоном, а з усією клієнтської областю, і не вимагає оголошення регіону зіпсованим для генерації WMPAINT, на відміну від BeginPaint

Для отримання дескриптора контексту принтера використовується функція CreateDC, а для його звільнення функція DeleteDC

Навчившись отримувати в програмі дескриптор контексту пристрою, розглянемо, як вивести на монітор графічну інформацію

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*