为什么两个Graphics.MeasureString测同一个字符串得出的长度不一样呢???

时间:2022-01-17 07:53:41
在窗体添加一个PrintDocument1,然后在它的PrintPage事件写如下代码,得出的两个Width为什么不一样啊???有没有办法不管使用任何Graphics的MeasureString得出的长度都一样呢???

Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        MsgBox(Me.CreateGraphics.MeasureString("ABC打印测试", Me.Font).Width & "," & e.Graphics.MeasureString("ABC打印测试", Me.Font).Width)
End Sub

15 个解决方案

#1


UP UP UP
有没有微软的工程师啊,这个问题我今天在VS2005上试了一下,依然存在这个问题

#2


学习

#3


Graphics和Device Contexts关联的,不同DC出来的结果可能不一样吧.
好像DC里面有关于字符宽度这类的描述,不过具体我不清楚...

#4


好奇怪哦。up一下

#5


有没有办法忽律或者修正这种误差呢???

#6


最头疼的是这个误差不是恒定的,计算不同的字符串得出的误差不一样

例如"ABC打印测试" 的误差和"ABC打印测试ABC"或者"打印测试"的误差都不一样啊~~~

#7


不同的字符肯定有时会不一样啦
相同的倒没有试过

#8


Me.CreateGraphics是当前类(WinForm?)的Graphics对象,
而e.Graphics是打印文档的Graphics对象,是两个不同的对象。
如果它们的FontSize和Font Family等等不同,Measure后肯定不一样嘛

#9


Me.CreateGraphics.MeasureString("ABC打印测试", Me.Font).Width 
e.MeasureString("ABC打印测试", Me.Font).Width
同意楼上,刚才试过

#10


唉,你们看清楚我的代码没有,我的对比都是测试同一个字符串,使用同样的参数的啊

说比例不恒定是对于同样的的参数下测试的,例如"ABC打印测试"比例是1.041,但测试"ABC打印测试ABC"比例就变成1.044了,如果没办法得到相同的长度,起码比例都要恒定嘛!!!

#11


但是你用的是CreateGraphics类与System.Drawing.Printing.PrintPageEventArgs.Graphics类呀
你用MsgBox(Me.CreateGraphics.MeasureString("ABC打印测试", Me.Font).Width & "," & Me.CreateGraphics.MeasureString("ABC打印测试", Me.Font).Width)怎么会不一样?

#12


楼上说的不是废话吗,这个我当然知道一样啦,我现在就是需要不同的Graphics也想达到一样的长度,就算不是一样,起码长度比例是恒定的,我现在就是寻找这样的解决办法嘛!!!

#13


主要是两者的PageUnit不一致,他们默认的设置都是GraphicsUnit.Display,该默认设置对于不同的设备值是不一样,就如打印机和显示器单位实际值是不一样的,所以你测试出来的长度是不一样的。你可以将PageUnit设置成GraphicsUnit.Inch或其他单位,应该测试出来的是一样的。

#14


MSDN里给出的GraphicsUnit.Display的解释为:将 1/75 英寸指定为度量单位。
这是个明显的错误。
应该参考(GDI+)中这一段:
UnitDisplay
Specifies display units. For example, if the display device is a monitor, then the unit is 1 pixel. 

#15


呵呵,楼上的是正解,我就是需要这个答案,无以为报,只能给分你了

#1


UP UP UP
有没有微软的工程师啊,这个问题我今天在VS2005上试了一下,依然存在这个问题

#2


学习

#3


Graphics和Device Contexts关联的,不同DC出来的结果可能不一样吧.
好像DC里面有关于字符宽度这类的描述,不过具体我不清楚...

#4


好奇怪哦。up一下

#5


有没有办法忽律或者修正这种误差呢???

#6


最头疼的是这个误差不是恒定的,计算不同的字符串得出的误差不一样

例如"ABC打印测试" 的误差和"ABC打印测试ABC"或者"打印测试"的误差都不一样啊~~~

#7


不同的字符肯定有时会不一样啦
相同的倒没有试过

#8


Me.CreateGraphics是当前类(WinForm?)的Graphics对象,
而e.Graphics是打印文档的Graphics对象,是两个不同的对象。
如果它们的FontSize和Font Family等等不同,Measure后肯定不一样嘛

#9


Me.CreateGraphics.MeasureString("ABC打印测试", Me.Font).Width 
e.MeasureString("ABC打印测试", Me.Font).Width
同意楼上,刚才试过

#10


唉,你们看清楚我的代码没有,我的对比都是测试同一个字符串,使用同样的参数的啊

说比例不恒定是对于同样的的参数下测试的,例如"ABC打印测试"比例是1.041,但测试"ABC打印测试ABC"比例就变成1.044了,如果没办法得到相同的长度,起码比例都要恒定嘛!!!

#11


但是你用的是CreateGraphics类与System.Drawing.Printing.PrintPageEventArgs.Graphics类呀
你用MsgBox(Me.CreateGraphics.MeasureString("ABC打印测试", Me.Font).Width & "," & Me.CreateGraphics.MeasureString("ABC打印测试", Me.Font).Width)怎么会不一样?

#12


楼上说的不是废话吗,这个我当然知道一样啦,我现在就是需要不同的Graphics也想达到一样的长度,就算不是一样,起码长度比例是恒定的,我现在就是寻找这样的解决办法嘛!!!

#13


主要是两者的PageUnit不一致,他们默认的设置都是GraphicsUnit.Display,该默认设置对于不同的设备值是不一样,就如打印机和显示器单位实际值是不一样的,所以你测试出来的长度是不一样的。你可以将PageUnit设置成GraphicsUnit.Inch或其他单位,应该测试出来的是一样的。

#14


MSDN里给出的GraphicsUnit.Display的解释为:将 1/75 英寸指定为度量单位。
这是个明显的错误。
应该参考(GDI+)中这一段:
UnitDisplay
Specifies display units. For example, if the display device is a monitor, then the unit is 1 pixel. 

#15


呵呵,楼上的是正解,我就是需要这个答案,无以为报,只能给分你了