在网上看了很多双缓冲的解决方案,但是没有一个解决我的问题。
主要是因为虽然看了很多,但是还是不理解双缓冲是怎么一回事情。我要实现一个画直线的程序。
大家都用过Win的画图板吧。
当大家选择画直线工具的时候,按下鼠标左键,这时候屏幕上就会随着鼠标的移动,有一条直线来回扫动,当松开鼠标左键的时候,直线就画到了画布上面。在这条直线扫动过程中,画布上原有的图案不会受到任何影响。老师以前教过怎么做这个,说是用XOR的办法覆盖掉那条直线。就是用反色再画一次。不过那样会出现一种情况,就是直线骚动的时候,如果直线下面有图案,就会出现反色的状况。比如,如果黑色直线在红色背景上扫描的时候,是浅蓝色的。可是Win的画图板完全没有我说的问题。我想问它是怎么实现的?还有,我在OnMouseMove里面使用双缓冲,到底对不对?void DDALine::OnMouseMove(UINT nFlags, CPoint point)
{
if (bl_drawing) //判断鼠标左键已经按下
{
//创建兼容的DC
CDC mem_dc;
mem_dc.CreateCompatibleDC(dc);
//创建大小相同的Bitmap
CBitmap mem_bmp, *oldBitmap;
mem_bmp.CreateCompatibleBitmap(&mem_dc,df.Width(),df.Height());
//关联DC和Bitmap,并且记录原来的指针
oldBitmap = mem_dc.SelectObject(&mem_bmp);
//在上面画新图
mem_dc.MoveTo(p_start);
mem_dc.LineTo(point);
//画到设备上
dc->BitBlt(0,0,df.Width(),df.Height(),&mem_dc,0, 0, SRCCOPY);
//切断mem_DC和mem_bmp的联系
mem_dc.SelectObject(oldBitmap);
//删除
mem_bmp.DeleteObject();
mem_dc.DeleteDC();
}
}我的这段代码并不能正常工作,画图的时候原来画布上有的东西就丢掉了

解决方案 »

  1.   

    画图部分应该放在OnDraw里面。
      

  2.   

    1. 在MouseMove和OnDraw中画的区别主要是可能画的次数不一样。Ondraw中可能要少一点。平且系统可能会替你管理一些不用画的区域。你要发刷新的消息。
    2。你的程序有错,DC和窗口都没有联系当然不会工作。
    3。XOR(异或)的算法是简单的消除上一次显示的方法。建议你先用,你的程序可以看出是刚学不久。以后其实只要是用以画的图像内容来刷新就可以不要异或的方法。
      

  3.   

    画图也不一定要放在 OnDraw ,只要有DC就可以