为什么调用CreateGraphics()会改变我的表单的外观?
问题描述:
在我的C#winforms应用程序中,我使用Graphics对象来获取当前的DPI值,以使我的代码可以缩放某些组件。这工作得很好,除非我一旦调用CreateGraphics(),我的winforms应用程序的外观和感觉就会改变。风格从熟悉的“圆形”按钮到更古老的“锐边”按钮。为什么调用CreateGraphics()会改变我的表单的外观?
为什么会发生这种情况,我该怎么做才能防止它发生?
我的代码如下所示:
Graphics g = this.CreateGraphics();
try
{
if (g.DpiX == 120.0f)
{
// scale the components appropriately
}
}
finally
{
g.Dispose();
}
其实我可以通过调用的createGraphics,然后立即它处置重现该问题。
任何帮助或洞察力非常感谢!
另一个问题是:是否有无需要创建一个Graphics对象来获取DPI设置?
答
前段时间,当一位同事开始使用高DPI显示器时,我正在处理DPI问题。
我的apporach是问桌面,而不是Dpi的特定窗口。当我遇到一些麻烦,我想出了这个代码(不漂亮,但对我来说相当奏效):
/// <summary>
/// Assesses the Systems Primary Monitor's DPI value
/// </summary>
public static double DPI {
get {
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
float ScreenScalingFactor = (float)PhysicalScreenHeight/(float)LogicalScreenHeight;
// dpi1 answers correctly if application is "dpiaware=false"
int dpi1 = (int)(96.0 * ScreenScalingFactor);
// dpi2 answers correctly if application is "dpiaware=true"
int dpi2 = GetDeviceCaps(desktop, (int)DeviceCap.LOGPIXELSX);
return Math.Max(dpi1, dpi2);
}
}
[DllImport("gdi32.dll")]
static private extern int GetDeviceCaps(IntPtr hdc, int nIndex);
private enum DeviceCap {
VERTRES = 10,
DESKTOPVERTRES = 117,
LOGPIXELSX = 88,
// http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html
}
我特别不喜欢使用Math.Max(dpi1, dpi2)
破解,但现在我发现没有解决方案更好
至于你原来的问题,在Win10上我看不到任何视觉上的变化。对不起,这里不知道。