请教怎样实现图形的无缝平移?看了孙以义老师的《计算机地图制图》,书中给出的代码是平移过程中先移动位图,再将位图用canvas.draw画到客户区上。如果图形比客户区小就没有问题,但如果当前图形比客户区大,比如先进行局部放大再平移,则这样平移的效果是只能移动客户区中显示的一部分,图形被切割了。我尝试使图形在移动时随时重画,在mousemove过程中用一个bmp画当前的图形,然后canvas.draw到客户区再repaint,但是结果在平移过程中图形只是在原地闪烁而没有移动,试了一天了还没有解决,没办法了来向高人求救,是我的方法有问题还是方法没错没有正确实现?最好是能提供点代码,关键部分就行。mousemove过程。如果只是画橡皮线然后显示最终的位置就不必了。谢谢!

解决方案 »

  1.   

    建议你把实现下面这段功能的代码:"在mousemove过程中用一个bmp画当前的图形,然后canvas.draw到客户区再repaint,但是结果在平移过程中图形只是在原地闪烁而没有移动,试了一天了还没有解决,"贴出来,让大家来看看,究竟有什么错误.
      

  2.   

    procedure TPanTool.MouseMove(x,y: Integer);
    begin
        _Draw(MovePt, Point(x,y));
        MovePt:= Point(x, y);
    end;
    procedure TPanTool._Draw(BeginPt, EndPt: TPoint);
    begin
        GDrv.Pan(BeginPt.X, BeginPt.Y, EndPt.X, EndPt.Y);
        GDrv.DrawMap(BlArray);                          //11111111111
        GDrv.Canvas.Draw(0,0,GDrv.OffScrBMP);           //11111111111GDrv是一个TGeoDrvWithDoubleBuffer类对象。有两个成员OffScrBMP和DoubleBuffered,前者是一个Bitmap类对象,绘图时在OffScrBMP中绘图然后载入窗体,DoubleBuffered是一个boolean变量,记录是否打开双缓冲。GDrv.Pan过程是计算平移后世界坐标原点的平移量,GDrv.DrawMap过程是在OffScrBMP中绘图。这两个过程是没有问题的,我的放大缩小局部放大功能都已经实现了,平移的过程如果把加注释的那两句改成Form1.repaint;就可以正常平移,但因为不停repaint所以会闪烁,因为FormPaint()过程中有清屏的语句。但如果不改,平移时会在左下角出现一个小窗口,平移时可以在小窗口里看到移动的画面,而窗体上又没有图形,直到松开鼠标才出现。我怀疑是OffScrBMP的尺寸的原因,但在状态栏输出尺寸数值时又没有错,不知道是怎么回事?对了,我改变了绘图的映射模式,是MM_Lometric模式。请教各位了,实在不行我就还是repaint了算了。