Если я правильно понимаю, вы хотите «затемнить» содержимое формы во время выполнения операции.
Как здесь уже говорили, очень сложно поступить правильно. Но есть способ сделать это легко, с одной оговоркой (см. Ниже).
Посмотрите на этот исходный код:
public partial class Form1 : Form
{
private Bitmap _background;
private bool _isShrouded;
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (true == _isShrouded && null!=_background)
e.Graphics.DrawImage(_background, 0, 0);
}
public void Shroud()
{
if (false == _isShrouded)
{
CreateScreenshot();
HideControls();
_isShrouded = true;
this.Invalidate();
}
}
public void Unshroud()
{
if (true == _isShrouded)
{
ShowControls();
_isShrouded = false;
this.Invalidate();
}
}
private void HideControls()
{
foreach (Control control in this.Controls)
control.Visible = false;
}
private void ShowControls()
{
foreach (Control control in this.Controls)
control.Visible = true;
}
private void CreateScreenshot()
{
Rectangle area = this.RectangleToScreen(this.ClientRectangle);
Bitmap screenGrab = new Bitmap(area.Width, area.Height);
Brush dark = new SolidBrush(Color.FromArgb(128, Color.Black));
Graphics g = Graphics.FromImage(screenGrab);
g.CopyFromScreen(area.Location, Point.Empty, area.Size);
g.FillRectangle(dark, 0, 0, area.Width, area.Height);
g.Dispose();
_background = screenGrab;
}
}
Класс Form1 имеет два основных метода: Shroud () и Unshroud ().
Метод Shroud () делает снимок формы и копирует его в растровое изображение, которое затем затемняется. Затем элементы управления скрываются, а растровое изображение отображается на форме.
Метод UnShroud () восстанавливает элементы управления и указывает форме больше не рисовать растровое изображение.
Для этого требуются две частные переменные: одна для хранения растрового изображения и флаг, поддерживающий текущее состояние.
Он также переопределяет OnPaint (), потому что он должен рисовать фоновое изображение, когда оно «окутано».
Примечание: Оболочка работает, сделав скриншот формы. Это означает, что форма ДОЛЖНА БЫТЬ самой верхней формой в точке окутывания. Если форма скрыта другими формами, они будут включены в скриншот. Я надеюсь, что это не будет проблемой для вас.
Примечание: Как уже было сказано, единственный способ добиться прозрачности в Windows - это полное взаимодействие со всеми задействованными элементами управления, и это трудная задача. Все остальное (включая это решение) на самом деле просто обман.