Контекст отображения для окна
Описанные выше контексты позволяют рисовать только в рабочей области окна. Контекст отображения для окна позволяет рисовать в любом месте окна – в области заголовка, системного меню, рамок, кнопок изменения размера окна и т. п. Контекст отображения для окна получают с помощью функции 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);
©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|