请教怎样实现图形的无缝平移?(100分)

  • 主题发起人 主题发起人 Regwolf
  • 开始时间 开始时间
R

Regwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
请教怎样实现图形的无缝平移?

看了孙以义老师的《计算机地图制图》,书中给出的代码是平移过程中先移动位图,再将位图用canvas.draw画到客户区上。如果图形比客户区小就没有问题,但如果当前图形比客户区大,比如先进行局部放大再平移,则这样平移的效果是只能移动客户区中显示的一部分,图形被切割了。

我尝试使图形在移动时随时重画,在mousemove过程中用一个bmp画当前的图形,然后canvas.draw到客户区再repaint,但是结果在平移过程中图形只是在原地闪烁而没有移动,试了一天了还没有解决,没办法了来向高人求救,是我的方法有问题还是方法没错没有正确实现?

最好是能提供点代码,关键部分就行。mousemove过程。如果只是画橡皮线然后显示最终的位置就不必了。谢谢!
 
用双缓冲可以解决闪烁,至于你哪个平移没移动,应该是坐标没弄对哈
 
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); //11111111111



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

对了,我改变了绘图的映射模式,是MM_Lometric模式。

请教各位了,实在不行我就还是repaint了算了。
 
delphi7的窗体就有一个双缓冲标志
Form1.DoubleBuffered
 
自己解决了,放分。
 
多人接受答案了。
 
后退
顶部