Я пишу приложение для рисования линии, прямоугольника, эллипса в клиентской области. Мне нужно сохранить изображение клиентской области, когда я рисую любую вещь. И я восстанавливаю его при появлении сообщения WM_PAINT.Как сохранить hdc и восстановить его?
Я использую HBITMAP для сохранения и восстановления
SAVE
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);
Но это не работает. Пожалуйста, помогите мне.
Не можете ли вы сделать это легко и сделать чертеж в WM_PAINT (а не)? – john
Это неправильно как на стороне сохранения, так и на стороне восстановления. Сторона сохранения будет захватывать только видимые пиксели. Пиксели, которые не видны (например, закрыты другим окном), не будут захвачены. Сторона восстановления вызывает 'BeginPaint' вне сообщения' WM_PAINT', что не рекомендуется. В этом случае он получает DC, который полностью вырезается, потому что ничего недействительно. Вы должны просто выполнить всю работу внутри 'WM_PAINT' - если вы хотите заменить клиентскую область, нарисуйте замену. Когда вы хотите восстановить старую клиентскую область, выполните старый код чертежа. –