2

我开发了一个控件,该控件根据其定位子元素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);
    }
4

2 回答 2

2

听起来问题是您的设备的分辨率与模拟器不同,即使屏幕尺寸相同。我知道一些较新的设备(尤其是摩托罗拉)具有 640x480 的屏幕分辨率,而不是标准的 320x240。

你应该做两件事来解决它。要在设计级别进行定位,只需将 Form 的AutoScaleMode属性设置为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);

希望有帮助!

于 2013-08-08T13:28:38.760 回答
1

加倍时控件的大小是否合适?如果您尝试在 PictureBoxes 上获得特定的分辨率,我假设您使用像素作为您的尺寸元素,当然如果您使用的是点或英寸,您的里程绝对会有所不同。

如果控件大小合适,或者符合您期望的参数,但定位最终出现在错误的位置,您可能应该重新审视您的定位方式(我建议放置的代码在这!)。

于 2013-08-07T13:59:54.367 回答