我写的是类似于windows的画图板的画直线的程序 ,点击鼠标左键开始画线,移动鼠标直线移动,当松开左键直线画好
但是当改变窗口大小的时候窗体重绘,原来画的图像就会消失,所以我想用双缓冲来解决这一问题 我把所画的线放在内存的位图里
然后重绘的时候把内存中的图像导出,这是我的想法
我定义的变量 
static HDC hmenu;
static int cxClient,cyClient,cxSource,cySource;
HDC hdc;
PAINTSTRUCT ps;
static POINT pt,pbegin;
static HBITMAP hBitmap;接下来是消息处理
          case WM_CREATE:                         
hdc = GetDC(hWnd);
hmenu = CreateCompatibleDC(hdc);
cxSource = CW_USEDEFAULT;
cySource = CW_USEDEFAULT;
hBitmap = CreateCompatibleBitmap(hdc,cxSource,cySource);
ReleaseDC(hWnd,hdc);
SelectObject(hmenu,hBitmap);      
return 0;
         case WM_PAINT:                                   //重绘
hdc = BeginPaint(hWnd,&ps);
//hmenu = CreateCompatibleDC(hdc);
////////////////////////////////////////////添加绘图代码
for (int y = 0; y<cyClient; y+=cySource)
for (int x = 0; x<cxClient; x+=cxSource)
{
BitBlt(hmenu,x,y,cxSource,cySource,hdc,0,0,SRCCOPY);  //将内存的图像导出
}
EndPaint(hWnd,&ps);
return 0;
         case WM_DESTROY:                           //窗体销毁时删除句柄和位图
DeleteDC(hmenu);
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
         case WM_LBUTTONDOWN:
                pbegin.x = pt.x =LOWORD(lParam);   //记录起始点的坐标
pbegin.y = pt.y =HIWORD(lParam);
                break;
         case WM_MOUSEMOVE:
                hdc = GetDC(hWnd);
                if (wParam & MK_LBUTTON)
{
SetROP2(hdc,R2_NOTXORPEN);
MoveToEx(hdc,pbegin.x,pbegin.y,NULL);
LineTo(hdc,pt.x,pt.y);

pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
MoveToEx(hdc,pbegin.x,pbegin.y,NULL);
LineTo(hdc,pt.x,pt.y);
                         }
                 ReleaseDC(hWnd,hdc);
                 break;
          case WM_LBUTTONUP:
               hdc = GetDC(hWnd);
               MoveToEx(hdc,pbegin.x,pbegin.y,NULL);
       LineTo(hdc,pt.x,pt.y);
               for (int y = 0; y<cyClient; y+=cySource)
for (int x = 0; x<cxClient; x+=cxSource)
{
BitBlt(hdc,x,y,cxSource,cySource,hmenu,0,0,SRCCOPY); //将窗体的图像导入内存
}
ReleaseDC(hWnd,hdc);
break;
但是这么写程序会崩掉  不会报错
请大家帮忙看一下哪里错了
双缓冲是否应该这样实现,如果我的整体思路没有错,实现的时候有什么不足的地方?
谢谢了  

解决方案 »

  1.   

    其实你直接在WM_PAINT里画直线就可以了,不必这么麻烦。
    按下左键记录开始点,弹起左键记录结束点,刷新界面,让WM_PAINT去画直线。移动时就还在WMWM_MOUSEMOVE中画。
      

  2.   

    你这个问题不是双缓冲的问题,而是重绘机制,你应该把你所绘制的图元都在内存保存起来,在ON_PAINT里加上对这些图元重绘即可。双缓冲是为了绘图时的闪烁和绘图速度而采用的一种方法。
      

  3.   

    这个只要保存一组 左键按下和弹起时候的点 CArray<CPoint> 然后在OnPaint的时候再连接下这些点就好了.