我編寫應用程序來繪製線,矩形,橢圓形在客戶區。當我繪製任何東西時,我需要保存客戶區的圖像。當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);
RESTORE
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 2013-05-01 16:23:35
這在保存側和恢復側都是錯誤的。保存側將只捕獲可見像素。不可見的像素(例如,被另一個窗口覆蓋)將不會被捕獲。恢復方在WM_PAINT消息外調用'BeginPaint',這是不推薦的。在這種情況下,它會獲得完全刪除的DC,因爲沒有任何內容無效。你應該在'WM_PAINT'內完成所有的工作 - 當你想替換客戶區時,繪製替換。當你想恢復舊的客戶區時,執行舊的繪圖代碼。 – 2013-05-02 19:46:18