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

Контекст отображения для окна



Описанные выше контексты позволяют рисовать только в рабочей области окна. Контекст отображения для окна позволяет рисовать в любом месте окна – в области заголовка, системного меню, рамок, кнопок изменения размера окна и т. п.

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