因此,我编写了代码以从父级创建一个新的 Windows 窗体,该窗体是全屏、黑色和 80% 的不透明度以创建调光效果。
然后在此上方显示另一个表单以显示进度。
代码目前看起来像这样:
this.Enabled = false;
frmDimScreen.BackColor = Color.Black;
frmDimScreen.Opacity = .8;
frmDimScreen.FormBorderStyle = FormBorderStyle.None;
frmDimScreen.Size = new Size(splitContainerMain.Width - 4, splitContainerMain.Height - 2);
frmDimScreen.StartPosition = FormStartPosition.Manual;
frmDimScreen.ShowIcon = false;
frmDimScreen.ShowInTaskbar = false;
frmDimScreen.Show();
frmDimScreen.Location = new Point(splitContainerMain.Location.X + 2, ((splitContainerMain.Location.Y + tsMainTools.Height) - 4));
addImgIL.ShowIcon = false;
addImgIL.ShowInTaskbar = false;
addImgIL.TopMost = true;
addImgIL.Show();
addImgIL.Location = new Point((this.Width - addImgIL.Width) / 2, (this.Height - addImgIL.Height) / 2);
addImgIL.BringToFront();
很明显,我对此提出质疑的主要原因是,如果父窗口失去焦点,那么子窗体就会乱序并且分层不正确。我知道我可以通过 OnPaint 处理这个问题,但正在寻找最佳解决方案。
问题/问题,这是实现我正在尝试的目标的最佳方法吗?我应该使用表格还是图形来创建调光?每个人对此有何经验?
提前致谢!
最佳答案
另一种仅使用单个窗口的方法是使用 alpha 混合图像绘制透明的深色背景(您甚至可以使用渐变)和非透明的自定义绘制进度条。参见 http://www.codeproject.com/KB/GDI-plus/perpxalpha_sharp.aspx .
在该项目中,您可以找到一个类,您可以使用该类轻松地将 alpha 混合位图分配给表单的背景。这种方法的问题是您必须自定义绘制表单上的所有内容,包括进度条或您需要的任何其他控件。
您尝试实现的效果对于 Windows 应用程序来说有点不寻常,这就是为什么最好的方法不是很简单。
关于C# 调暗屏幕、多个 Windows 窗体的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7373483/