2

に基づいて子要素を配置するコントロールを開発しましたHeight。エミュレーターでテストするとすべて正常に動作しますが、実際のデバイスでは(Height * 2)正しく配置するために使用する必要があります。

これに加えて16x16、エミュレーターでは問題なく見えるアイコンが、実際のデバイスではPictureBox、高さと幅が突然 2 倍になるため、ひどく拡大されます。

この有線現象は、アプリケーションをテストしたすべてのデバイスで発生します。

それはモバイル デバイスの画面解像度に何らかの関係がありますか? この問題の原因は何ですか?どうすれば修正できますか?

編集: 要素の次の位置を計算するコードは次のとおりです。コメントアウトされたコードはデバイスでは機能しますが、エミュレーターでは機能しません。

    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

問題は、画面サイズが同じであっても、デバイスの解像度がエミュレーターと異なることです。一部の新しいデバイス (特に Motorola 製) では、標準の 320x240 ではなく 640x480 の画面解像度が使用されていることを私は知っています。

それを解決するためにあなたがすべきことは2つあります。デザイン レベルで行う配置については、フォームのAutoScaleModeプロパティを に設定するだけSystem.Windows.Forms.AutoScaleMode.Dpiです。これにより、フォームはベースラインとして DPI を使用して、デザイナーでレイアウトされたすべてのものを正しく配置します。デバイスの画面解像度がエミュレータの 2 倍である場合、子コントロールのすべての高さと幅がデバイス上で 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

コントロールを 2 倍にしたときのサイズは適切ですか? PictureBoxesで特定の解像度を取得しようとしている場合は、サイズ変更要素としてピクセルを使用していると思いますが、もちろん、ポイントまたはインチを使用している場合、マイレージは絶対に異なります.

コントロールが適切なサイズであるか、期待するパラメーター内に収まっているが、配置が間違った場所に収まっている場合は、配置方法を正確に再検討する必要があります (コードを配置することをお勧めします)。ここに!)。

于 2013-08-07T13:59:54.367 に答える