Winforms 在不同的计算机上绘制图元文件时的不同缩放比例
在使用以毫米为度量单位的元文件的WinForms应用程序中,我在获得一致的伸缩性方面遇到了问题。我编写了一个小样本应用程序来说明这个问题 这是应用程序在Windows 7桌面计算机上的外观: 这是应用程序在Windows 8笔记本电脑上的外观: 源代码:Winforms 在不同的计算机上绘制图元文件时的不同缩放比例,winforms,metafile,Winforms,Metafile,在使用以毫米为度量单位的元文件的WinForms应用程序中,我在获得一致的伸缩性方面遇到了问题。我编写了一个小样本应用程序来说明这个问题 这是应用程序在Windows 7桌面计算机上的外观: 这是应用程序在Windows 8笔记本电脑上的外观: 源代码: private void MainForm_Paint(object sender, PaintEventArgs e) { var g = e.Graphics; var blueBrush = new SolidBrush(
private void MainForm_Paint(object sender, PaintEventArgs e)
{
var g = e.Graphics;
var blueBrush = new SolidBrush(Color.Blue);
var bluePen = new Pen(blueBrush);
g.DrawRectangle(bluePen, 0, 0, 200, 200);
g.DrawLine(bluePen, 100, 0, 100, 200);
g.DrawLine(bluePen, 0, 100, 200, 100);
g.DrawString(g.DpiX+" dpi", new Font("Arial", 10), blueBrush, 0, 205);
Metafile metafile;
var size = new Size(200, 200);
using (var stream = new MemoryStream())
{
using (Graphics offScreenBufferGraphics = Graphics.FromHwndInternal(IntPtr.Zero))
{
IntPtr deviceContextHandle = offScreenBufferGraphics.GetHdc();
metafile = new Metafile(stream, deviceContextHandle, new RectangleF(0, 0, size.Width, size.Height), MetafileFrameUnit.Millimeter, EmfType.EmfPlusOnly);
offScreenBufferGraphics.ReleaseHdc();
using (Graphics mg = Graphics.FromImage(metafile))
{
mg.PageUnit = GraphicsUnit.Millimeter;
var redPen = new Pen(new SolidBrush(Color.Red));
const float scaleFactor = 0.75f;
mg.ScaleTransform(scaleFactor, scaleFactor);
mg.DrawLine(redPen, 0, 0, 200, 200);
mg.DrawLine(redPen, 0, 200, 200, 0);
}
}
}
g.DrawImage(metafile, 0, 0, 200, 200);
}
这两台机器都设置为96dpi,但Win8机器将图元文件(红十字)渲染得更小
比例系数0.75是根据标准72 dpi和当前96 dpi之间的差值计算得出的,72/96=0.75,是否正确编辑:请参见下面的答案,为什么这不起作用。
但最重要的是,为什么它在Win8机器上的缩放不同,我可以获取什么设置来进行补偿?似乎Win8机器需要1.25左右的比例因子才能使红十字与蓝色矩形对齐
谢谢 在阅读代码项目文章后,我自己找到了答案。结果表明,计算机上的屏幕大小(台式机上为1920x1200,笔记本电脑上为1600x900)会影响图元文件的分辨率。用于计算比例因子0.75的72 dpi的假设在我的台式机上是正确的,但在Win8笔记本电脑上不是 可以从图元文件头获取图元文件分辨率,然后用于计算正确的比例因子:
var metafileHeader = metafile.GetMetafileHeader();
float sx = metafileHeader.DpiX/g.DpiX;
float sy = metafileHeader.DpiY/g.DpiY;
mg.ScaleTransform(sx, sy);
完整的代码可以找到
然后我在两台机器上都获得了正确的缩放比例: