计算比例尺的问题(200分)

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

Regwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手,我编写了一个图形程序,该程序能读进固定格式的文件,这些文件中含有一些已知点的地理坐标。程序计算比例尺然后将这些点绘制到客户窗口。我编写的时候是在me下,一切正常。但在xp下运行时会出现一个问题,就是绘制出来的图形比客户窗口小了很多,而实际在me下运行时是占满整个客户区的。不知是怎么回事,请那位高手给点意见,谢谢。下面是我的计算比例尺的函数:


procedure TGeoDrv.AdjustScale; //调整地理坐标与逻辑坐标的比例以及地理坐标原点
Var Scale_X, Scale_Y : Real;
begin
Scale_X := (Xmax-Xmin)/CliHeight ;
Scale_Y := (Ymax-Ymin)/CliWidth ;
Scale := max(Scale_X, Scale_Y); //取大的比例才能保证网形可以完整显示且不变形
Scale := Scale*GetDeviceCaps(GetDC(Application.Handle),LOGPIXELSX)/254; //MM_TEXT与MM_LOMETRIC的比例,既是0.1mm的像素数,一般为96/254

Scale := Scale*1.05; //适当缩小网图

XOrg := Xmin - (CliHeight*max(Scale_X, Scale_Y)*1.05 - (Xmax-Xmin))/2 ; //设置地理坐标的起点并使网图居中
YOrg := Ymin - (CliWidth*max(Scale_X, Scale_Y)*1.05 - (Ymax-Ymin))/2 ;

end;


CliHeight和CliWidth分别是实际绘图的客户区域的高和宽。

需要强调的是,我绘图是直接在form上绘制的,没有用Paintbox或Image,我在form上放置了一个toolbar,一个statusbar,因此上面函数中的CliHeight值为form1.ClientHeight-StatusBar1.Height-ToolBar1.Height。我试过在xp和me下分别显示form1.ClientHeight的值,发现会差10。但这个不是原因,因为不管客户区的高和宽是什么值,因为上面函数的结果,都应该是占满整个客户区的。另外,映射模式是MM_LOMETRIC,所以要乘以96/254。

不是字符集的问题,我已经在view as text状态下将字符集改成GB2312,字体改成宋体了。而且其他的显示都很正常。
 
你适当的修改Scale 的大小,检查看看是什么原因。
 
屏幕分辨率是一样的吗?
 
如果是地图软件 有个VB程序
 
好像XP的主题模式也有可能使显示的区域有误差的,把显示调到最精简的状态不知道有没有用。
 
是一样的分辨率,主题模式也是默认的。

改过SCALE的值,会变化,但当在XP下占满客户区的时候,在ME下就大得超出区域了。
 
那你测试了在xp和me下
Scale := max(Scale_X, Scale_Y); //取大的比例才能保证网形可以完整显示且不变形
Scale := Scale*GetDeviceCaps(GetDC(Application.Handle),LOGPIXELSX)/254;
这两句运行的变化吗?
如果可以有规律,你可以通过检测操作系统来进行调整。
 
窗体设置问题
Form1.Scaled := False;
 
Milpas,Form1.Scaled := False; 不是这个的问题,我是这样设置的,何况是同样的分辨率。

zywcd,变化是有的,因为Form1的ClientHeight在XP和ME下差了10,所以计算出来的Scale也差了一点点,但这个不是关键,因为我按ME下计算出的Scale给XP下的Scale直接赋值也是不能占满绘图区。

另外请教一下,大家编类似的程序时是用什么来绘图?PaintBox?Image?还是像我这样直接在Form上绘图?我觉得直接在Form上绘图麻烦多多啊。
 
看个人喜欢吧,我喜欢Image。
如果只是Form1的ClientHeight在不同操作系统的变化,根据你的程序看,不会影响这么大吧,是不是这个函数回来的差别大?GetDeviceCaps(GetDC(Application.Handle),LOGPIXELSX)
 
我发现问题了,我直接在窗体上画线,如下:
Canvas.Moveto(0,Round(A.CliHeight*254/96));
Canvas.Lineto(Round(A.CliWidth*254/96), Round(A.CliHeight*254/96));

因为我的映射模式是MM_LOMETRIC,所以乘以254/96。这句代码的作用是画出整个绘图区域的上边线,结果在XP下画出来高度和长度都跟实际应该的不同,而在ME下则完全正确,所以问题应该在这里:如果映射模式是MM_LOMETRIC,怎么画出跟默认的MM_TEXT一样长的线段?我的办法就是乘以254/96,但看来好像在XP下和ME下作用结果不同。
 
自己解决了。放分!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部