none
Win8.1でPosionToScreenで場所が合わない RRS feed

  • 質問

  • お世話になっております。古典厩といいます。

    WindowsのDesktopアプリを作っています。
    MouseMoveに合わせて選択領域を「ControlPaint.DrawReversibleFrame」を使って
    描画しようとしています。

    簡略化すると、空っぽのFormにMouseDownイベントを作成して

            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                Point pt1 = new Point(e.X, e.Y);
                Point pt2 = (sender as Control).PointToScreen(pt1);
                ControlPaint.DrawReversibleFrame(new Rectangle(pt2.X, pt2.Y, 10, 10), Color.Black, FrameStyle.Thick);
            }
    

    としたところ、通常のPCであればちゃんとクリックしたところで描画されるのですが、
    自分のPC(Surface Pro3ーWindows8.1)で実行したところ、クリックした位置とは
    異なる場所に描画されてしまいました。

    どうやら、ポイントが1.5倍ずれていて、Mouseは「150,150」にあるとすると、描画は
    「100,100」に行われるようです。(Program上で無理やり1.5倍にすると想定通りに
    描画されました。)
    そもそも画面の解像度は「2160x1440」と設定されていますが、PictureBox上で
    1画面内に表示されるのは凡そ「1400x1000」ほどのようです。(画像が少し膨らんでいる。)

    あいにく手元にWin8.1のPCが1台しかないため、この事象がWin8.1固有のものなのか、
    Surface固有のものなのかが判断できません。
    Program上のもの、というより何等かの画面表示の設定が問題なのかもしれませんが、
    これを回避する方法はご存知ありませんでしょうか。

    以上です。よろしくお願いします。

    2015年6月9日 6:51

回答

  • High DPIの影響ではないでしょうか? 未対応アプリケーションの場合、DPI仮想化により、仮想的な座標系での計算となります。1.5倍ずれているとのことですので、150%拡大されているかと。まずは画面の拡大率を100%に設定して値を確認してみてください。
    • 回答としてマーク 古典厩 2015年6月9日 14:00
    2015年6月9日 8:15

すべての返信

  • High DPIの影響ではないでしょうか? 未対応アプリケーションの場合、DPI仮想化により、仮想的な座標系での計算となります。1.5倍ずれているとのことですので、150%拡大されているかと。まずは画面の拡大率を100%に設定して値を確認してみてください。
    • 回答としてマーク 古典厩 2015年6月9日 14:00
    2015年6月9日 8:15
  • こんばんは。

    確かにHigh DPIの影響でした。

    #初めてこの機能について知りました…。

    田中達彦さんのBlog「アプリの高DPI(High DPI)対応について」 を
    参考に対応しました。

    (リンクが挿入できないのでタイトルだけ…)

    ありがとうございました。

    2015年6月9日 14:00