WPF 计算屏幕位置
需求:在主窗口右下角弹出信息提示框
过程:
1.右下角弹出,首先要知道主窗口的位置,再根据主窗口的宽和高计算右下角的位置:
右下角(mainWindow.Left + mainWindow.ActualWidth,mainWindow.Top + mainWindow.ActualHeight);
此方法可以得到主窗口的右下角,但是,这是在主窗口的WindowState为:Normal情况下;如果主窗口WindowState为:Maximized,计算就会出错,因为Left和Top的值并不会变化,还是为Normal时的值。因为主窗口已经最大化,所以可以计算整个屏幕的Width和Height,来得到屏幕的右下角。
2.屏幕右下角计算(Maximized模式):
如果就一块屏幕,起始点(0,0),还可以用上面的计算公式:右下角(0 + mainWindow.ActualWidth,0 + mainWindow.ActualHeight);
如果有多块屏幕就需要计算当前屏幕的位置,当前屏幕在多块屏幕中的位置(x,y),也是当前屏幕的起始位置,当前屏幕获取:
System.Drawing.Rectangle Rectangle = new System.Drawing.Rectangle((int)mainWindow.Left, (int)mainWindow.Top, (int)mainWindow.Width, (int)mainWindow.Height);
System.Windows.Forms.Screen s = System.Windows.Forms.Screen.FromRectangle(Rectangle);
右下角(s.WorkingArea.X + s.WorkingArea.Width,s.WorkingArea.Y + s.WorkingArea.Height); 到此,不管主窗口是正常模式还是最大化,屏幕的单屏还是多屏,都可以找到右下角了。(正常模式,多屏和单屏一样计算,1即可)
但是,你以为到这里就结束了吗?还有一个因素会影响位置的计算,那就是屏幕的缩放比,正常都是100%,但是在非100%的情况下,屏幕的像素值会发生变化。这里又分为两种情况:
一、主屏是100%,副屏含有非100%,此种情况上面计算不受影响。
二、主屏非100%,副屏100%,举个例子:
主屏: 125% 像素:1920 x 1080 实际:1536 x 864
副屏: 100% 像素:1920 x 1080
在程序中获取屏幕的值时:
主屏:像素:1920 x 1080,副屏:像素:2400 x 1350
也就是说,当主屏的缩放比增大或缩小时,并不会改变主屏的像素值,只会将副屏的像素值做对应的修改。所以此种情况下要将所有值除以主屏的缩放比。
总结:
在定位计算像素时,可以灵活的计算窗口的Left,Top,ActualWidth,ActualHeight,或显示窗口的屏幕WorkingArea值,影响计算的因素有:窗口的WindowState,屏幕的个数和屏幕的缩放比。(注意区分文中的主窗口和主屏幕)
最后上我的代码: