Учебное пособие: Основы графического вывода
Второй способ сохранения контекста основан на описании окна, как окна, использующего сохранение контекста устройства. В этом случае для окна (или для всего класса окон) создается специальный контекст, который сохраняется между операциями его освобождения и получения. Таким образом появляется возможность сохранять все сделанные изменения в атрибутах контекста.
Для этого надо, регистрируя класс окна, указать стиль CS_OWNDC. Этот стиль указывает, что каждое окно этого класса имеет свой собственный контекст устройства. В этом контексте сохраняются все его атрибуты. Далее вы обычным способом получаете и освобождаете контекст устройства, но его атрибуты не надо устанавливать каждый раз заново.
При работе с окнами, имеющими стиль CS_OWNDC удобно настраивать атрибуты контекста при создании окна, например так:
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{WNDCLASSwc;
// при регистрации класса окна задать стиль CS_OWNDC:
wc.style= CS_OWNDC;...
RegisterClass (&wc);...}
// при обработке сообщений в оконной функции:
LRESULT WINAPI _export WinProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{HDC hDC;
PAINTSTRUCT ps;
switch (wMsg) {
case WM_CREATE:...
hDC= GetDC (hWnd);
// ... установить атрибуты при создании окна
ReleaseDC (hWnd, hDC);...
break;
case WM_PAINT:
hDC= BeginPaint (hWnd, &ps);
// обычные функции получения хендла контекста устройства будут теперь
// возвращать хендл сохраненного контекста.
// здесь используются атрибуты, установленные ранее...
EndPaint (hWnd, &ps); // контекст по-прежнему должен быть освобожден
break;
case ...:...}
...}
Недостатком этого способа считается то, что каждое окно этого класса постоянно удерживает созданный контекст в памяти, что может быстро привести к использованию всех ресурсов компьютера.
В частном случае все окна одного класса могут иметь одинаковые атрибуты. Тогда можно указать стиль не CS_OWNDC, а CS_CLASSDC. Этот стиль указывает на то, что используется только одна сохраненная копия контекста в памяти, которая используется всеми окнами данного класса. В этом случае можно настраивать атрибуты контекста еще в функции WinMain, сразу после создания первого окна этого класса.