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中指定它們的位置。 –

相關問題