以下是一段利用计时器写的移动图片的代码,但碰到一个问题,就是虽然图片可以移动,但是不能擦除移动前的图像,也就是说图片在移动的时候,前面的图像都没有擦除,请帮忙修改一下代码,使能擦除前面的图像!谢谢!
case WM_TIMER:
HDC dc,hmemdc;
HBITMAP hbmp,holdbmp;
dc=GetDC(hWnd);
hmemdc=CreateCompatibleDC(dc);
         hbmp=LoadBitmap(hInst,plane[0].bmpsrc);   //载入图片
holdbmp=(HBITMAP)SelectObject(hmemdc,hbmp);  
BitBlt(dc,plane[0].xPos,100,100,100,hmemdc,0,0,SRCCOPY);  //plane[0].xPos是图片横坐标
         DeleteObject(SelectObject(htempdc,holdbmp));
DeleteObject(hmemdc);
DeleteObject(dc);
plane[0].xPos=plane[0].xPos+1;  //横坐标随着计时器每次位置移动1个像素。
break;

解决方案 »

  1.   

    在BitBlt之前,先擦除上次显示的图像,覆盖或者用bitblt异或一下
      

  2.   

    代码比较多,给你个思路:
    每次显示图片需要记录图片的显示位置,下一次移动计算一下新旧位置之间的矩形,如果窗口背景是纯色,FillRect画背景色檫除原图象,如果背景有图案,BitBlt那一小块背景。
    如果不是平移而是任意移动,为防止闪烁,你应该创建一幅宽高都是该图象两倍的内存图象,每次计算一下移动距离看原图象与新图象是否有重叠部分,没有的话FillRect画背景色或BitBlt背景檫除原图象,如果有,两个图象的包容矩形肯定小于刚才创建的内存图象,在该图象上画背景然后画图片,再显示该内存图象。