【发布时间】:2010-02-01 12:42:54
【问题描述】:
我想通过 C# 在整个屏幕上覆盖一个灰色的半透明区域。这可以通过 Windows 窗体实现吗?我将如何做?
【问题讨论】:
-
嘿,也许你终于可以让那个该死的 UAC 提示有用了,如果你可以把你的窗口放在它的提示上......
标签: c#
我想通过 C# 在整个屏幕上覆盖一个灰色的半透明区域。这可以通过 Windows 窗体实现吗?我将如何做?
【问题讨论】:
标签: c#
当然,只需创建一个覆盖所有桌面屏幕的无边框、半透明窗口即可。
您可以使用以下 LINQ 找到正确的 Rectangle 来覆盖所有屏幕:
Rectangle bounds = Screen.AllScreens
.Select(x => x.Bounds)
.Aggregate(Rectangle.Union);
然后从bounds设置窗口的Left、Top、Width和Height
【讨论】:
FormBorderStyle 属性设置为None 使其无边界。
Size = bounds.Size; 和Location = bounds.Location; 作为我的代码,但是,它不适用于非标准屏幕布局。就像 1 中的 2 一样,上面的内容只显示在一台显示器上,而不是同时显示。
除了使用 Johannes 的建议将 'FormBorderStyle 属性设置为 'None 之外,我还将在此表单上设置以下属性以“调暗”屏幕:
我会在表单的 Load 事件中设置“变暗”表单的大小:如果我想处理添加到项目中的表单,我会使用 Rob 回答中的优雅代码来设置边界多显示器的情况。如果我只想处理一台显示器,我会做一些简单的事情,比如:
// in the Load Event of the "dim-out" Form
this.Bounds = Screen.PrimaryScreen.Bounds;
然后,当然,您可以在需要时显示此“变暗”表单,以响应可见表单上的任何内容。
显示“淡出”表单将使其显示在您的应用程序的其他可见表单之上(除非其中一个设置了 TopMost 或 TopLevel 属性)。
但是您可以实现的一个很好的效果是在显示 MessageBox(或模态显示的表单)之前显示您的“暗淡”表单:这意味着您将拥有 MessageBox 对话框(或模态表单)“前面”,后面的一切都“变暗”。
下面是显示“暗淡”表单的代码的样子:
dimmedForm.Show();
// change these to suit your taste or purpose
// this.BringToFront();
// dimmedForm.BringToFront();
// example of showing a MessageBox over the dimmedForm
// which will block the current thread
MessageBox.Show("why not ?");
// now hide the dimmedForm
dimmedForm.Hide();
您可能想查看 'TopLevel 属性(在设计时未公开)并刷新有关该属性如何影响屏幕上的表单顺序的知识,以及检查 'TopMost 属性一个表单(在设计时公开)。
【讨论】: