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