一.引子
在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;
}
}