我在使用标准数据驱动的Winform应用程序时遇到了一个有趣的问题。
该应用程序最初是在Windows 7和Visual Studio 2010上开发的。然后我使用Windows 8和Visual Studio 2010构建了一个新的开发机器。我发布了一个基于Windows 8机器的Winform应用程序的新版本。没有源代码更改,相同的.NET 4.0框架目标。在Windows 7上运行Winform应用程序的客户端PC现在遇到表单呈现问题。在Windows 7上,控件似乎有点嘎吱作响,在视觉上改变了表单,在某些情况下,渲染功能被破坏(由于渲染问题导致控件关闭)。
我已经升级到VS2012,并以.NET 4.5为目标。同样的问题仍然存在。
我需要做些什么才能在Windows 7和Windows 8之间获得一致的表单呈现?
答案 0 :(得分:0)
我有类似的问题。为了解决这个问题,我需要检查当前的DPI设置并水平和垂直缩放尺寸。该辅助类提供水平和垂直缩放:HDpiScale,VDpiScale。
用法:
MyControl.Height = (int) (MyControl.Height * util.VDpiScale);
MyControl.Width = (int) (MyControl.Width * util.HDpiScale);
仅当字体大小为x1.25
时才会有所不同public class PresentationUtils : IPresentationUtils
{
private double vDpiScale = -1;
private double hDpiScale = -1;
public double HDpiScale
{
get
{
if (hDpiScale < 0)
SetDpiScales();
return hDpiScale;
}
}
public double VDpiScale
{
get
{
if (vDpiScale < 0)
SetDpiScales();
return vDpiScale;
}
}
private void SetDpiScales()
{
vDpiScale = 1;
hDpiScale = 1;
IntPtr dc = GetDC(IntPtr.Zero);
try
{
int hPixels = GetDeviceCaps(dc, (int) DeviceCap.LOGPIXELSX);
int vPixels = GetDeviceCaps(dc, (int) DeviceCap.LOGPIXELSY);
vDpiScale = vPixels/96.0;
hDpiScale = hPixels/96.0;
}
finally
{
ReleaseDC(IntPtr.Zero, dc);
}
}
[DllImport("gdi32.dll")]
public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
}
public enum DeviceCap
{
/// <summary>
/// Logical pixels inch in X
/// </summary>
LOGPIXELSX = 88,
/// <summary>
/// Logical pixels inch in Y
/// </summary>
LOGPIXELSY = 90,
}