WPF 屏幕坐标系问题

一.引子

在Window7中,有一个可以“调整字体大小”的功能。这个功能只要在桌面的空白区域,点击右键,然后在弹出的菜单中选择“个性化”,就会弹出如下的界面。如图1:


图1

点击“显示”之后就会在右侧的区域内看到是“使阅读屏幕上的内容更容易”。在其下有三个选项,分别是“较小(S)-100%(默认)”、“中等(M)-125%和较大(L)-150%”。在正常的状态下,当前屏幕处于“较小(S)-100%(默认)”的这个选项。如下图2:

图2

二.问题

当调整字体大小后不重启电脑(Win7 sp1必须要重启后才能生效)(如默认100%,调整为150%)
    WPF中控件坐标系统还是100%的标准

当调整字体大小后重启电脑(Win7 sp1必须要重启后才能生效)(如默认100%,调整为150%)
    WPF中控件坐标系统为150%的标准

总结:WPF计算坐标系不标准,当需要实际位置区域时需用物理坐标系获取

三.延伸

裁剪全屏图片需要用物理坐标系,不能使用WPF控件坐标系

#region 获取物理坐标系

        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;

            public POINT(int x, int y)
            {
                X = x;
                Y = y;
            }

            public override string ToString()
            {
                return ("X:" + X + ", Y:" + Y);
            }
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool GetCursorPos(out POINT pt);

#endregion

#region Win32 API
        [DllImport("user32.dll")]
        static extern IntPtr GetDC(IntPtr ptr);
        [DllImport("gdi32.dll")]
        static extern int GetDeviceCaps(
            IntPtr hdc, // handle to DC
            int nIndex // index of capability
        );
        [DllImport("user32.dll", EntryPoint = "ReleaseDC")]
        static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
        #endregion

        #region DeviceCaps常量
        const int HORZRES = 8;
        const int VERTRES = 10;
        const int LOGPIXELSX = 88;
        const int LOGPIXELSY = 90;
        const int DESKTOPVERTRES = 117;
        const int DESKTOPHORZRES = 118;
        #endregion

        /// <summary>        
        /// /// 真实设置的屏幕分辨率大小    
        /// /// </summary>           
        public static Size PhysicalArea
        {
            get
            {
                IntPtr hdc = GetDC(IntPtr.Zero);
                Size size = new Size
                {
                    Width = GetDeviceCaps(hdc, DESKTOPHORZRES),
                    Height = GetDeviceCaps(hdc, DESKTOPVERTRES)
                };
                ReleaseDC(IntPtr.Zero, hdc);
                return size;
            }
        }


        /// <summary>        
        /// /// 获取屏幕分辨率当前虚拟大小        
        /// /// </summary>           
        public static Size WorkingArea
        {
            get
            {
                IntPtr hdc = GetDC(IntPtr.Zero);
                Size size = new Size
                {
                    Width = GetDeviceCaps(hdc, HORZRES),
                    Height = GetDeviceCaps(hdc, VERTRES)
                };
                ReleaseDC(IntPtr.Zero, hdc);
                return size;
            }
        }

 

参考:C#工作总结(五):Winform与WPF程序处理DPI问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值