gpt4 book ai didi

visual-studio-2008 - 为什么所有 GUI 元素突然都有两倍的高度和宽度?

转载 作者:行者123 更新时间:2023-12-04 04:46:26 25 4
gpt4 key购买 nike

我开发了一个控件,它根据 Height 定位子元素。 .当我用模拟器测试时一切正常,但在实际设备上我必须使用 (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属性(property)到System.Windows.Forms.AutoScaleMode.Dpi .这导致表单使用 DPI 作为基线来正确定位设计器中布局的所有内容。如果您设备的屏幕分辨率是模拟器的 2 倍,您将看到设备上子控件的所有高度和宽度都加倍。

对于手动定位,您必须进行一些数学计算。 .NET CF 使用 96 DPI 作为基准进行测量,因此当屏幕 DPI = 96 时,则 1 个单位 = 1 个像素。您可以通过将设备的 DPI 与 96 进行比较来正确确定单位的缩放比例。

要计算设备的屏幕 DPI,请使用以下 P/Invokes:

    [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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com