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
Code:
HDC hdcBackup, hdcCanvas;
HBITMAP hbitBackup;
HBRUSH hbBackup;
PAINTSTRUCT ps;
The repaint
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;
All of the drawing takes place in this function, which I've doubled to draw on the backup hdc as well.
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?