Как сохранить HDC и восстановить его?

Я пишу приложение для рисования линии, прямоугольника, эллипса в клиентской области. Мне нужно сохранить изображение области клиента, когда я рисую любую вещь. И я восстанавливаю его при появлении сообщения WM_PAINT.

Я использую HBITMAP для сохранения и восстановления

СПАСТИ

RECT rc;
GetClientRect(hMain, &rc); // hMain: handle main window
hdc = GetDC(hMain);
HDC hdcMem = CreateCompatibleDC(hdc);
// hbm: handle bitmap to save and restore
hbm = CreateCompatibleBitmap(hdc, rc.right - rc.left, rc.bottom - rc.top);

SelectObject(hdcMem, hbm);
BitBlt(hdcMem, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
hdc, rc.right - rc.left, rc.bottom - rc.top, SRCCOPY);
ReleaseDC(hMain, hdc);

ВОССТАНОВИТЬ

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hMain, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
HDC hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hbm);
BitBlt(hdc, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
hdcMem, rc.right - rc.left, rc.bottom - rc.top, SRCCOPY);
ReleaseDC(hMain, hdc);
EndPaint(hMain, &ps);

Но это не работает. Пожалуйста, помогите мне.

0

Решение

Если вы действительно не собираетесь делать это трудным путем, я бы отказался от этого подхода. Я вижу две разумные альтернативы:

  1. Просто сделайте все рисование внутри WM_PAINT. Когда вы хотите, чтобы линии, прямоугольники, эллипсы и т. Д. Исчезли, установите некоторую переменную (или любую другую), чтобы указать, что они исчезли, и аннулируйте окно, чтобы вызвать перерисовку. Это общепринятый способ, и работы находят большую часть времени.

  2. Создайте второе окно, перекрывающее клиентскую область вашего текущего окна. Создайте это как многослойное окно с CS_SAVEBITS стиль установлен в своем классе окна. Нарисуйте здесь свои линии, эллипсы и т. Д. И просто разрушьте окно, когда вы хотите, чтобы они исчезли.

CS_SAVEBITS автоматически делает то, что вы пытаетесь сделать прямо сейчас: сохраняет растровое изображение области под окном, которое используется для восстановления основного окна (полностью автоматически), когда CS_SAVEBITS окно исчезает. И у этого, и у того, что вы сейчас делаете, есть одна и та же проблема: сохраненный растр не отслеживать любые изменения в основном окне — они просто восстанавливают то, что было там, когда было создано верхнее окно, которое может устареть. Это работает правильно, только если основное окно остается статичным в течение всего времени.

Если это проблема, объедините два подхода: отключите CS_SAVEBITS в окне наложения. Когда оно разрушено, основное окно будет признано недействительным и восстановит себя с помощью обычной логики перерисовки.

3

Другие решения

Других решений пока нет …