Описанные выше контексты позволяют рисовать только в рабочей области окна. Контекст отображения для окна позволяет рисовать в любом месте окна – в области заголовка, системного меню, рамок, кнопок изменения размера окна и т. п.
Контекст отображения для окна получают с помощью функции GetWindowDC. Далее он используется аналогично общему контексту отображения. При этом начало системы координат находится в левом верхнем углу окна, а не рабочей области. Прототип функции подобен прототипу функции GetDC:
HDC GetWindowDC(HWND hwnd);
Для освобождения контекста отображения для окна вызывают функцию ReleaseDC.
Для вывода в различные части окна нужно предварительно определить метрики окна с помощью функции GetSystemMetrics.
Задача. Заголовок окна вывести красным шрифтом.
Листинг 3.5. Вывод в область заголовка окна.
#include <windows.h>
#include <tchar.h>
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
TCHAR szClass[] = TEXT("MyCaption");
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
HWND hwnd;
|
|
hInstance = hInst;
if (!RegClass(WndProc, szClass, COLOR_WINDOW))
return FALSE;
hwnd = CreateWindow(szClass, NULL,
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 = 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 = NULL;
wc.lpszClassName = szName;
return (RegisterClass(&wc)!= 0);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static short nCap, nFr;
TCHAR szCap[] = TEXT("Мой заголовок окна");
switch (msg)
{
case WM_CREATE:
{
//Определяем высоту заголовка окна
nCap = GetSystemMetrics(SM_CYCAPTION);
//Определяем толщину рамки окна
nFr = GetSystemMetrics(SM_CYFRAME);
return 0;
}
case WM_MOVE:
case WM_SIZE:
{
HDC hdc = GetWindowDC(hwnd);
//Установка атрибутов вывода и вывод текста
SetTextColor(hdc, RGB(255, 0, 0));
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, nCap+nFr, 3*nFr/2, szCap, _tcslen(szCap));
ReleaseDC(hwnd, hdc);
return 0;
}
case WM_DESTROY: { PostQuitMessage(0); return 0; }
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
При создании окна определены высота заголовка и толщина рамки окна:
nCap = GetSystemMetrics(SM_CYCAPTION);
nFr = GetSystemMetrics(SM_CYFRAME);
При любом изменении размеров и перемещении окна в область заголовка выводится строка "Мой заголовок окна". В соответствии с требованиями задачи установлены красный цвет шрифта и прозрачный режим вывода (текущий фон используется в качестве фона вывода текста):
SetTextColor(hdc, RGB(255, 0, 0));
SetBkMode(hdc, TRANSPARENT);