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

标签 visual-studio-2008 compact-framework screen-resolution

我开发了一个根据子元素的高度定位子元素的控件。当我使用模拟器测试时一切正常,但在实际设备上我必须使用 (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/

相关文章:

sql - 为什么 - 'GENERATE INSERT UPDATE AND SELECT STATEMENT' 变灰?

c# - 将子类转换为继承类

java - 平板电脑 - 获取可绘制的屏幕分辨率,而不是总屏幕分辨率

javascript - 如何为所有分辨率监视器和移动设备正确显示 html 页面?

java - 如何在不同分辨率下获取同一位置的鼠标位置

c++ - 我有一些范围问题(for 循环后出现身份不明的标识符错误)

C# - Listview 列标题高度(Windows 窗体)

c# - 如何在没有第三方库的情况下在 CF 2.0 中制作透明图像?

c# - 为 Windows Mobile 开发应用程序,C#

.net - 如何获取正在执行的 .exe 的名称?