I'm working on a multi-user paint style program. The obvious problem of repainting comes up when the canvas is minimized or covered, etc. I've attempted to fix the problem by having a backup HDC handy and drawing to it as well, but it apparently does nothing. I've used examples from books and from the forums but it fails to do anything. Here is the relevant code:
Global variables
The repaintCode:HDC hdcBackup, hdcCanvas; HBITMAP hbitBackup; HBRUSH hbBackup; PAINTSTRUCT ps;
All of the drawing takes place in this function, which I've doubled to draw on the backup hdc as well.Code:LRESULT WINAPI CanvasDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch(uMsg) { case WM_CREATE: { int maxX = GetSystemMetrics(SM_CXSCREEN); int maxY = GetSystemMetrics(SM_CYSCREEN); hdcCanvas = GetDC(hDlgCanvas); hdcBackup = CreateCompatibleDC(hdcCanvas); hbitBackup = CreateCompatibleBitmap(hdcCanvas, maxX, maxY); SelectObject(hdcBackup, hbitBackup); hbBackup = (HBRUSH)GetStockObject(WHITE_BRUSH); SelectObject(hdcBackup, hbBackup); PatBlt(hdcBackup, 0, 0, maxX, maxY, PATCOPY); ReleaseDC(hDlgCanvas, hdcCanvas); } break; case WM_PAINT: hdcCanvas = BeginPaint(hDlgCanvas, &ps); BitBlt(hdcCanvas, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hdcBackup, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY); EndPaint(hDlgCanvas, &ps); break;
Code:void DrawObj(CPaintTool crPaintTool) { hdcCanvas = GetDC(hDlgCanvas); COLORREF crColor = RGB(crPaintTool.cRed, crPaintTool.cGreen, crPaintTool.cBlue); SelectObject(hdcCanvas, (HGDIOBJ)CreatePen(PS_SOLID, crPaintTool.LineWidth, crColor)); switch (crPaintTool.ToolID) { case PIXELBRUSH: MoveToEx(hdcBackup, crPaintTool.pStart.x, crPaintTool.pStart.y, NULL); LineTo(hdcBackup, crPaintTool.pStart.x, crPaintTool.pStart.y); MoveToEx(hdcCanvas, crPaintTool.pStart.x, crPaintTool.pStart.y, NULL); LineTo(hdcCanvas, crPaintTool.pStart.x, crPaintTool.pStart.y); break; case LINE: MoveToEx(hdcBackup, crPaintTool.pStart.x, crPaintTool.pStart.y, NULL); LineTo(hdcBackup, crPaintTool.pEnd.x, crPaintTool.pEnd.y); MoveToEx(hdcCanvas, crPaintTool.pStart.x, crPaintTool.pStart.y, NULL); LineTo(hdcCanvas, crPaintTool.pEnd.x, crPaintTool.pEnd.y); break; case RECTANGLE: MoveToEx(hdcBackup, crPaintTool.pStart.x, crPaintTool.pStart.y, NULL); LineTo(hdcBackup, crPaintTool.pStart.x, crPaintTool.pEnd.y); LineTo(hdcBackup, crPaintTool.pEnd.x, crPaintTool.pEnd.y); LineTo(hdcBackup, crPaintTool.pEnd.x, crPaintTool.pStart.y); LineTo(hdcBackup, crPaintTool.pStart.x, crPaintTool.pStart.y); MoveToEx(hdcCanvas, crPaintTool.pStart.x, crPaintTool.pStart.y, NULL); LineTo(hdcCanvas, crPaintTool.pStart.x, crPaintTool.pEnd.y); LineTo(hdcCanvas, crPaintTool.pEnd.x, crPaintTool.pEnd.y); LineTo(hdcCanvas, crPaintTool.pEnd.x, crPaintTool.pStart.y); LineTo(hdcCanvas, crPaintTool.pStart.x, crPaintTool.pStart.y); break; case CIRCLE: Ellipse(hdcBackup, crPaintTool.pStart.x, crPaintTool.pStart.y, crPaintTool.pEnd.x, crPaintTool.pEnd.y); Ellipse(hdcCanvas, crPaintTool.pStart.x, crPaintTool.pStart.y, crPaintTool.pEnd.x, crPaintTool.pEnd.y); break; default: break; } ReleaseDC(hDlgCanvas, hdcCanvas); }
What am I missing?



LinkBack URL
About LinkBacks


