Cod*_*ody 37 c# screen winforms
我正在开发一个应用程序,它记住用户关于表单最后位于屏幕上的位置的首选项.在某些情况下,用户将其放在辅助屏幕上,然后在没有第二个屏幕的情况下稍后启动应用程序(有时窗体显示在屏幕外).其他时候,用户将改变其分辨率,从而产生类似的效果.
我希望在Form_Shown事件处理程序中执行此检查.基本上我想确定表格是否完全不在屏幕上,所以我可以重新定位它.
有什么建议?
And*_*ija 61
如果表格完全在屏幕上,请检查此功能:
public bool IsOnScreen( Form form )
{
Screen[] screens = Screen.AllScreens;
foreach( Screen screen in screens )
{
Rectangle formRectangle = new Rectangle( form.Left, form.Top,
form.Width, form.Height );
if( screen.WorkingArea.Contains( formRectangle ) )
{
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
如果它在屏幕上只检查左上角:
public bool IsOnScreen( Form form )
{
Screen[] screens = Screen.AllScreens;
foreach( Screen screen in screens )
{
Point formTopLeft = new Point( form.Left, form.Top );
if( screen.WorkingArea.Contains( formTopLeft ) )
{
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
小智 16
将上述所有解决方案与"IntersectsWith"方法和LINQ扩展相结合,简而言之:
public bool IsOnScreen(Form form)
{
// Create rectangle
Rectangle formRectangle = new Rectangle(form.Left, form.Top, form.Width, form.Height);
// Test
return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(formRectangle));
}
Run Code Online (Sandbox Code Playgroud)
Cra*_*Tim 10
这里有完整的解决方案(基于所有答案).我添加了一个参数MinPercentOnScreen,其中所有屏幕/显示中必须至少显示此百分比的像素.因此,如果返回false,则需要将窗口的位置移回默认位置.
// Return True if a certain percent of a rectangle is shown across the total screen area of all monitors, otherwise return False.
public bool IsOnScreen(System.Drawing.Point RecLocation, System.Drawing.Size RecSize, double MinPercentOnScreen = 0.2)
{
double PixelsVisible = 0;
System.Drawing.Rectangle Rec = new System.Drawing.Rectangle(RecLocation, RecSize);
foreach (Screen Scrn in Screen.AllScreens)
{
System.Drawing.Rectangle r = System.Drawing.Rectangle.Intersect(Rec, Scrn.WorkingArea);
// intersect rectangle with screen
if (r.Width != 0 & r.Height != 0)
{
PixelsVisible += (r.Width * r.Height);
// tally visible pixels
}
}
return PixelsVisible >= (Rec.Width * Rec.Height) * MinPercentOnScreen;
}
Run Code Online (Sandbox Code Playgroud)
执行:
return IsOnScreen(this.Location, this.Size);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15069 次 |
| 最近记录: |