Здавалка
Главная | Обратная связь

Общий контекст отображения



Этот контекст отличает высшая скорость доступа к нему. Для получения общего контекста вызывают функцию BeginPaint (при обработке сообщения WM_PAINT) или GetDC (для рисования при обработке других сообщений). Стиль класса окна с общим контекстом отображения не может содержать значения CS_OWNDC, CS_PARENTDC или CS_CLASSDC.

Функция GetDC возвращает контекст отображения для рабочей области окна hwnd:

 

HDC GetDC( HWND hwnd);

 

Параметры возвращаемого контекста зависят от стиля класса указанного окна. Для общего контекста функция GetDC устанавливает заданные по умолчанию атрибуты. А параметры контекста отображения класса окон или личного контекста отображения функция GetDC оставляет неизменными. Если hwnd = NULL, то возвращается контекст видеомонитора с началом координат в левом верхнем углу экрана. В последнем случае допускается вывод в любом месте экрана.

В случае ошибок функция GetDC возвращает NULL.

Эту функцию вызывают, если требуется вывод в окно во время обработки других сообщений, не посылая сообщения WM_PAINT.

Для освобождения общего контекста отображения, полученного функцией GetDC, вызывают функцию ReleaseDC. Контекст отображения для класса окон и личный контекст отображения освобождать не обязательно. Функция ReleaseDC освобождает только общий контекст отображения или контекст отображения для окна:

 

int ReleaseDC( HWND hwnd, HDC hdc);

 

Здесь hwnd – дескриптор окна, чей контекст должен быть освобожден, a hdc – освобождаемый контекст отображения.

Если контекст освобожден, возвращаемое значение 1, иначе – нуль.

Приложения вызывают функцию ReleaseDC для каждого вызова функции GetWindowDC и для каждого вызова функции GetDC.

Еще раз обращаем ваше внимание на необходимость своевременного освобождения общего контекста отображения.

Задача. При обработке сообщения WM_PAINT в центре рабочей области окна малиновым цветом шрифта на кремовом фоне вывести строку "Вывод при обработке сообщения WM_PAINT". После нажатия левой клавиши мыши на 60 пикселей выше синим цветом шрифта на желтом фоне вывести строку "Вывод при обработке сообщения WM_LBUTTONDOWN".

Листинг 3.3. Вывод текста при обработке различных сообщений

#include <windows.h>

#include <tchar.h>

 

BOOL RegClass(WNDPROC, LPCTSTR, UINT);

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

 

HINSTANCE hInstance;

TCHAR szClass[] = TEXT("OutputClass");

 

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR IpszCmdLine, int nCmdShow)

{

MSG msg;

HWND hwnd;

hInstance = hInst;

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

return FALSE;

hwnd = CreateWindow(szClass, TEXT("Вывод текста"),

WS_OVERLAPPEDWINDOW | WS_VISIBLE,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,

0, 0, hInstance, NULL);

if (!hwnd) return FALSE;

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.lpszClassName = szName;

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

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

wc.lpszMenuName = NULL;

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

}

 

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

{

static short cx, cy;

switch (msg)

{

case WM_SIZE:

{

cx=LOWORD(lParam); cy=HIWORD(lParam); return 0;

}

case WM_PAINT:

{

TCHAR szText[]=TEXT("Вывод при обработке сообщения WM_PAINT");

PAINTSTRUCT ps;

HDC hdc = BeginPaint(hwnd, &ps);

//Цветом вывода символов выбираем малиновый

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

//Цветом фона вывода символов выбираем кремовый

SetBkColor(hdc, RGB(255, 251, 240));

SetTextAlign(hdc, TA_CENTER);

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

EndPaint(hwnd, &ps);

return 0;

}

case WM_LBUTTONDOWN:

{

TCHAR szText[] = TEXT("Вывод при обработке сообщения WM_LBUTTONDOWN");

HDC hdc = GetDC(hwnd);

//Цветом вывода символов выбираем синий

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

//Цветом фона вывода символов выбираем желтый

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

SetTextAlign(hdc, TA_CENTER);

TextOut(hdc, cx/2, cy/2-60, szText, _tcslen(szText));

ReleaseDC(hwnd, hdc);

return 0;

}

case WM_DESTROY: { PostQuitMessage(0); return 0; }

}

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

}

 

После запуска этого приложения на экране появляется окно приложения с заголовком "Вывод текста". В центре рабочей области окна малиновым цветом шрифта на кремовом фоне отображен текст "Вывод при обработке сообщения WM_PAINT".

Если нажать левую клавишу мыши, на 60 пикселей выше этой строки появится еще одна строка: "Вывод при обработке сообщения WM_LBUTTONDOWN" – синим цветом шрифта на желтом фоне.

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







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.