Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_4(моя).doc
Скачиваний:
8
Добавлен:
18.08.2019
Размер:
442.37 Кб
Скачать
  1. Этот метод используется при обработке сообщения wm_paint. Контекст устройства получают вызовом функции BeginPaint, имеющей следующий прототип:

HDC BeginPaint(

HWND hwnd, – дескриптор окна;

LPPAINTSTRUCT lPaint – указатель на структуру типа PAINTSTRUCT

);

В случае успешного завершения функция возвращает дескриптор контекста дисплея для клиентской области окна. Кроме этого функция заполняет поля структуры PAINTSTRUCT, имеющей следующее определение:

typedef struct tagPAINTSTRUCT {

HDC hdc; – контекст устройства;

BOOL fErase; – признак стирания фона клиентской области;

RECT rcPaint; – границы недействительного прямоугольника;

BOOL fRestore; –

BOOL flncUpdate; –

BYTE rgbReserved[32];

} PAINTSTRUCT;

Последние три поля используются операционной системой. Поле rcPaint типа RECT содержит координаты обновляемого прямоугольника в пикселах относительно левого верхнего угла клиентской области окна. Эти координаты либо определяются системой, либо задаются при вызове функции InvalidateRect. Регион отсечения в этом случае определяется посредством пересечения видимого региона и обновляемого прямоугольника.

Поле fErase определяет будет ли Windows обновлять фон недействительного региона. Если fErase имеет значение TRUE, то это означает стирание (обновление) фона. Когда обновляемый регион формируется вызовом функции InvalidateRect или InvalidateRgn, то один из параметров этих функций разрешает или подавляет стирание фона.

Если задано стирание фона, то функция BeginPaint посылает оконной процедуре сообщение WM_ERASEBKGND. Приложение может обработать это сообщение, чтобы отобразить однородный или растровый фон. Однако обычно оно обрабатывается по умолчанию функцией DefWindowProc, которая обновляет фон с использованием кисти, определённой в поле hbrBackground класса окна. До своего завершения функция BeginPaint посылает оконной процедуре ещё одно сообщение – WM_NCPAINT. Оно заставляет приложение перерисовывать неклиентскую область. Это сообщение обрабатывается также функцией DefWindowProc.

Типовой процесс обработки сообщения WM_PAINT выглядит следующим образом:

case WM_PAINT;

hDC = BeginPaint(hWnd, &ps);

[использование функций GDI]

EndPaint(hWnd,&ps);

return 0;

После завершения операций рисования приложение должно вызвать функцию EndPaint, чтобы освободить контекст устройства.

Пример: в центре рабочей области окна вывести текст.

_______________________________________________________________

#include <windows.h>

bool RegClass(WNDPROC,LPCTSTR,UINT);

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE hInstance;

char szMainClass[]="MainClass";

char szTitle[]="Вывод текста";

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,

LPSTR lpszCmdLine, int nCmdShow)

{

MSG msg;

hInstance=hInst;

HWND hwnd;

if (!RegClass(WndProc,szMainClass,COLOR_WINDOW))

return FALSE;

hwnd=CreateWindow(szMainClass,szTitle,WS_POPUPWINDOW|WS_CAPTION|

WS_MINIMIZEBOX|WS_VISIBLE,0,0,500,500,0,0,hInstance,NULL);

if (!hwnd) return FALSE;

ShowWindow(hwnd,SW_SHOWMAXIMIZED);

UpdateWindow(hwnd);

while (GetMessage(&msg,0,0,0))

DispatchMessage(&msg);

return msg.wParam;

}

bool RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)

{

WNDCLASS wc;

wc.style=CS_HREDRAW|CS_VREDRAW;

wc.cbClsExtra=wc.cbWndExtra=0;

wc.lpfnWndProc=Proc;

wc.hInstance=hInstance;

wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wc.hCursor=LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground=(HBRUSH)(brBackground+1);

wc.lpszMenuName=(LPCTSTR)NULL;

wc.lpszClassName=szName;

return (RegisterClass(&wc)!=0);

}LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)

{char szText[]="Выводим текст";

static short cx,cy;

switch(msg)

{

case WM_SIZE:

{cx=LOWORD(lParam);

cy=HIWORD(lParam);

return 0;

}

case WM_PAINT:

{

PAINTSTRUCT ps;

HDC hdc=BeginPaint(hwnd,&ps);

SetTextColor(hdc,RGB(255,0,0));

SetBkColor(hdc,RGB(0,255,255));

SetTextAlign(hdc,TA_CENTER);

TextOut(hdc,cx/2,cy/2,szText,strlen(szText));

EndPaint(hwnd,&ps);

return 0;

}

case WM_DESTROY:

{PostQuitMessage(0); return 0;}

}

return DefWindowProc(hwnd,msg,wParam,lParam);

}

_______________________________________________________________

Результат работы программы:

Функции:

SetTextColor(hdc,RGB(255,0,0)) – цвет текста;

SetBkColor(hdc,RGB(0,255,255)) – цвет заливки;

SetTextAlign(hdc,TA_CENTER) – выравнивание текста;

UpdateWindow(HWND hwnd) – посылает сообщение WM_PAINT функциио бновляемого окна. Прототип данной функции:

BOOL UpdateWindow(HWND hwnd).

В случае успешного выполнения функция возвращает ненулевое значение, иначе – 0.

II) Если рисование должно происходить не в блоке обработки сообщения WM_PAINT или если дескриптор контекста устройства нужен не для рисующих функций (например, в качестве аргумента функции GetTextMetrics), то в таких случаях контекст устройства получают либо вызовом функции GetDC следующим образом:

hdc=GetDC(hWnd);

либо вызовом функции GetWindowDC:

hdc= GetWindowDC(hWnd);

Первая функция возвращает дескриптор контекста дисплея для клиентской области окна hWnd, а вторая – для всего окна. Если в качестве аргумента hWnd передать значение NULL, то обе функции вернут дескриптор для всего экрана.

По окончании работы с функциями GDI необходимо освободить контекст устройства с помощью функции ReleaseDC, например:

hDC=GetDC(hWnd);

[использование функций GDI]

ReleaseDC(hWnd,hDC);

В отличие от контекста устройства, полученного при помощи вызова функции BeginPaint, контекст устройства, возвращаемый функцией GetDC, работает с регионом отсечения, который равен всей клиентской области, то есть рисование можно производить в любом месте клиентской области. Функция GetDC не делает действительными какие-либо недействительные зоны.

Функцией GetDC пользуются программы текстовых редакторов, обрабатывая сообщения от клавиатуры, а также программы рисования, обрабатывая сообщения от мыши.

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