Этот контекст отличает высшая скорость доступа к нему. Для получения общего контекста вызывают функцию 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. Результаты вывода при обработке других сообщений стираются и не восстанавливаются.