我开发了一个根据子元素的高度定位子元素的控件。当我使用模拟器测试时一切正常,但在实际设备上我必须使用 (Height * 2)
来正确定位它。
除此之外,16x16
的图标在模拟器中看起来不错,但在实际设备上放大得非常厉害,因为 PictureBox
的高度突然增加了一倍和宽度。
这种有线现象发生在我测试该应用程序的所有设备上。
这与移动设备的屏幕分辨率有某种关系吗? 造成此问题的原因是什么以及如何解决此问题?
编辑: 这是计算元素的下一个位置的代码。注释掉的代码适用于设备,但不适用于模拟器。
private Point GetNextUserControlLocation(Control control)
{
var numberOfControls = Controls.Count;
if (numberOfControls < 1)
return new Point(1, 1);
var latest = Controls[numberOfControls - 1];
var x = latest.Location.X;
// var y = latest.Location.Y + control.Height * 2 + 1;
var y = latest.Location.Y + control.Height + 1;
return new Point(x, y);
}
最佳答案
听起来问题是您的设备的分辨率与模拟器不同,即使屏幕尺寸相同。我知道一些较新的设备(特别是摩托罗拉的)具有 640x480 屏幕分辨率,而不是标准的 320x240。
您应该做两件事来解决这个问题。要在设计级别进行定位,只需将窗体的 AutoScaleMode
属性设置为 System.Windows.Forms.AutoScaleMode.Dpi
即可。这是因为表单使用 DPI 作为基线来正确定位设计器中布局的所有内容。如果您的设备的屏幕分辨率是模拟器的 2 倍,您将看到设备上子控件的所有高度和宽度都加倍。
对于手动定位,您需要做一些数学计算。 .NET CF使用96 DPI作为测量基准,因此当屏幕DPI = 96时,则1单位= 1像素。您可以通过将设备的 DPI 与 96 进行比较来正确确定单位的缩放量。
要计算设备的屏幕 DPI,请使用以下 P/Invoke:
[DllImport("coredll.dll", EntryPoint = "GetDC", SetLastError = true)]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("coredll.dll", SetLastError = true)]
public static extern int GetDeviceCaps(IntPtr hDC, int nIndex);
[DllImport("coredll.dll", SetLastError = true)]
public static extern void ReleaseDC(IntPtr hDC);
private const int LOGPIXELSX = 88;
private const int LOGPIXELSY = 90;
以下是获取 X 和 Y 方向标量值的辅助函数的摘录:
//get handle to desktop
IntPtr hDC = GetDC(IntPtr.Zero);
try
{
if (hDC != IntPtr.Zero)
{
int logPixelX = GetDeviceCaps(hDC, LOGPIXELSX);
int logPixelY = GetDeviceCaps(hDC, LOGPIXELSY);
_scaleX = (float)logPixelX / 96.0f;
_scaleY = (float)logPixelY / 96.0f;
}
}
finally
{
if (hDC != IntPtr.Zero)
ReleaseDC(hDC);
}
将其包装到一个类中,添加 ScaleX 和 ScaleY 函数,您可以使用scaleX 和scaleY 的值来调整您的位置。您的定位代码现在可以如下所示:
var y = latest.Location.Y + control.Height + UICoordinateScalar.ScaleY(1);
希望有帮助!
关于visual-studio-2008 - 为什么所有 GUI 元素的高度和宽度突然变成原来的两倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105214/