2

我开发了一个控件,它根据它的Height定位一个子元素。一切正常,当我用模拟器进行测试时,但在实际设备上,我必须使用(Height * 2)来正确定位它。为什么所有GUI元素突然都有两倍的高度和宽度?

除此之外,图标是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); 
    } 
+0

WM6.1?什么样的设备? – jp2code

+0

Windows Mobile 6.5设备 – xsl

回答

2

听起来像这样的问题是,即使屏幕尺寸相同,您的设备的分辨率也不同于模拟器。我知道一些较新的设备(特别是来自摩托罗拉)拥有640x480的屏幕分辨率,而不是标准的320x240。

您应该做两件事来解决它。对于您在设计级别进行的定位,只需将表格的AutoScaleMode属性设置为System.Windows.Forms.AutoScaleMode.Dpi。这是因为表单使用DPI作为基准来正确定位设计器中的所有内容。如果你的设备的屏幕显示为仿真器的2倍,你会发现设备上的子控件的所有高度和宽度都加倍。

对于手动定位,你必须做一些数学。 .NET CF使用96 DPI作为测量的基准,所以当屏幕DPI = 96时,1单位= 1像素。您可以正确地判断要通过比较你的设备的DPI提高96

缩放单位为计算设备的屏幕DPI,使用下面的P /调用:

[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); 

希望有所帮助!

+0

现货答复。很多Windows Embedded Handheld设备都是完整的VGA设备,而WinMo 6.5之前的设备通常是QVGA。 – tcarvin

1

是控制权大小当您双击它?我假设你使用像素作为尺寸元素,如果你试图在PictureBox上获得特定的分辨率,虽然当然如果你使用点数或英寸,你的里程将会完全不同。

如果控件尺寸合适,或者符合您所期望的参数,但定位最终会出现在错误的位置,那么您应该重新确切地重新定位它的定位方式(代码我建议把它放在这里!)。

+0

我添加了代码。正如你所看到的,我必须使用Height * 2。我会理解它是否基于更高的分辨率进行了一些自动升级,但是不得不使用Height * 2狂吠。 – xsl

+0

我正在讲述一点我的元素,因为我总是用足够的时间去完成我的WPF培训并忘记几乎所有的东西,但是这对我来说看起来非常WinForms-y;我真的不知道你是否在这里谈论过老派。我想你应该通过Children.Add将控件添加到面板/堆栈/ what-have-you,然后在XAML中指定它们的位置。 –

相关问题