2014-12-04 2 views
-2

Мне это сложно объяснить, поэтому я создал макет для того, что я хочу.Создание темного фона при появлении новой формы

Mockuk example

Может кто-то здесь объяснить, как я мог это сделать? Может быть, какой-то код может помочь, но я думаю, что общая идея или направление могут быть достаточными.

Я хочу затемнить родительский фон всякий раз, когда перед ним открывается новое окно.

+0

являются элементы управления, сидя на 'Panel' если да, то просто изменить цвет фона панели .. Вы можете по крайней мере показать код, чтобы лучше выразить то, что у вас есть – MethodMan

+0

SO о конкретных проблемы с кодированием, ваш вопрос точно не подходит здесь. «Может кто-то здесь объяснить, как я мог это сделать? Может быть, какой-то код может помочь, но я думаю, что общая идея или направление могут быть достаточными. ' –

+0

Путь слишком общий вопрос. Что вы хотите сделать? Каковы требования? Что конкретно вы застряли (у вас даже есть первая созданная форма)? –

ответ

8

сделать скриншот формы и раскрасить полупрозрачный прямоугольник над ним. Добавьте это изображение в панель размером формы и принесите ее на передний план. Отобразите свой диалог. Избавиться от панели:

private void button1_Click(object sender, EventArgs e) 
    { 
     // take a screenshot of the form and darken it: 
     Bitmap bmp = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height); 
     using (Graphics G = Graphics.FromImage(bmp)) 
     { 
      G.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; 
      G.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), this.ClientRectangle.Size); 
      double percent = 0.60; 
      Color darken = Color.FromArgb((int)(255 * percent), Color.Black); 
      using (Brush brsh = new SolidBrush(darken)) 
      { 
       G.FillRectangle(brsh, this.ClientRectangle); 
      } 
     } 

     // put the darkened screenshot into a Panel and bring it to the front: 
     using (Panel p = new Panel()) 
     { 
      p.Location = new Point(0, 0); 
      p.Size = this.ClientRectangle.Size; 
      p.BackgroundImage = bmp; 
      this.Controls.Add(p); 
      p.BringToFront(); 

      // display your dialog somehow: 
      Form frm = new Form(); 
      frm.StartPosition = FormStartPosition.CenterParent; 
      frm.ShowDialog(this); 
     } // panel will be disposed and the form will "lighten" again... 
    } 
0

Похоже, вам нужно создать событие (возможно, включить перечисление для «Пуск», «Завершить» или сделать его «bool», чтобы он мог сигнализировать «Пуск/Завершение» в том же событии). Сделайте ваше большое окно подпиской на это событие. Когда пришло время показать/создать новую форму, запустите это событие (с аргументом event arg установите «Пуск»). Когда большое окно видит событие «Старт», оно делает все, что ему нужно, и темнеет. Когда новая форма исчезнет, ​​запустите событие Completed. Когда большая форма видит событие «Завершено», оно восстанавливается.

+0

'... он делает все, что ему нужно, и темнеет сам.' Я * думаю * это та часть, которую пытается выяснить ОП. – LarsTech

+0

@ LarsTech - Если это то, что он хотел спросить, тогда он должен был просто попросить об этом. Мне кажется, он спрашивает о последовательности действий, а не «как затемнить область клиента в winforms на 60%» или «Могу ли я использовать наложение, чтобы затемнить область моего клиента». – StarPilot

+1

Что касается потемнения экрана, есть несколько способов. С самого начала я мог бы захватить его клиентскую область, создать новую панель, размер которой соответствует ей, и установить ее прозрачность примерно на 40% или 60%. Когда он хочет вернуться к нормальной жизни, он просто удаляет панель или устанавливает ее размер в 0,0,1,1 и устанавливает ее вне поля зрения. Много способов сделать визуальный эффект. И поэтому он должен спросить об эффекте, не показывая другую форму. – StarPilot

2

Я не знаю, как сделать управление темнее. А так как полупрозрачные элементы управления беспорядок, тоже, вот способ, который получает эффект путем наложения формы на другую, пустую форму, которая является полупрозрачным:

Form fff; 

fff = new Form(); 
fff.ControlBox = false; 
fff.MinimizeBox = false; 
fff.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
fff.Text = ""; 
fff.Size = Size; 
fff.BackColor = Color.DarkSlateBlue; 
fff.Opacity = 0.2f; 
fff.Show(); 
fff.Location = this.Location; 

Если вы хотите только ClientRectangle в появляются затемненным изменить эти строки:

fff.Size = ClientSize; 
fff.Location = PointToScreen(Point.Empty); 

После этого откройте вторичную форму и при закрытии вы снова скрыть это наложение форму ..

+0

Это может быть способ сделать это. Я действительно думаю, что это немного грязный способ, но я не могу придумать другого возможного способа добиться чего-то подобного. Благодаря! –

+1

Вы правы, но WinForms точно не предназначены для богатых визуальных эффектов. – TaW