2012-04-28 21 views
1

Form.ShowDialog()を使用してダイアログフォームを開くとき、残りのアプリケーションをグレーの色合いで暗くしたいと思います。非アクティブなフォームを暗くする

自分自身の研究から、黒い背景と不透明度が100%未満のフチ無しのフォームを開くことができるように思われますが、すべての作品をどのように組み合わせて、それを行う方法。

提案が参考になります。おかげさまで

答えて

5

これは、開いているフォームを縁どり、同じサイズの別のフォームに重ねることによって最も効果的です。これにより、コントロールとタイトルバーを含め、フォーム全体を無効にすることができます。プロジェクトに新しいクラスを追加し、このコードを貼り付けます。

using System; 
using System.Drawing; 
using System.Collections.Generic; 
using System.Windows.Forms; 

class DialogOverlay : IDisposable { 
    public DialogOverlay() { 
     var cnt = Application.OpenForms.Count; 
     for (int ix = 0; ix < cnt; ++ix) { 
      var form = Application.OpenForms[ix]; 
      var overlay = new Form { Location = form.Location, Size = form.Size, FormBorderStyle = FormBorderStyle.None, 
       ShowInTaskbar = false, StartPosition = FormStartPosition.Manual, AutoScaleMode = AutoScaleMode.None }; 
      overlay.Opacity = 0.3; 
      overlay.BackColor = Color.Gray; 
      overlay.Show(form); 
      forms.Add(overlay); 
     } 
    } 
    public void Dispose() { 
     foreach (var form in forms) form.Close(); 
    } 
    private List<Form> forms = new List<Form>(); 
} 

そして、このようにそれを使用します。

private void DialogButton_Click(object sender, EventArgs e) { 
     using (new DialogOverlay()) 
     using (var dlg = new Dialog()) { 
      if (dlg.ShowDialog(this) == DialogResult.OK) { 
       // etc... 
      } 
     } 
    } 

効果を調整するために不透明度とBackColorプロパティのプロパティを微調整。 OpenFileDialogなどのビルトインのものや、アプリケーションの開いたフォームのセットなど、あらゆる種類のダイアログで動作します。 Application.OpenFormsはちょっとしたバグですので注意してください。

+0

ありがとう、これです。 - wee bit buggyのリンクがありますか? – Nezreli

0

「アプリケーションの残りの部分」を暗くすることは何を意味するのかよく分かりませんが、100%未満の不透明度でグレーの色合いでアプリケーションを色付けする方法を説明します。

コード(私はあなたがC#を使用していると仮定しています):

Graphics g = this.CreateGraphics(); // Creating graphics for this form. 
g.FillRectangle(Color.FromArgb(80, 102, 90, 95), 0, 0, this.Width, this.Height); 
// Draws a gray rectangle with an opacity of 30% over the whole form. 

次にあなたが使用することができます灰色の四角形を取り除くために:

フォームを再描画します
this.Invalidate(); 

、すべてのコントロールは同じままですが、グレーは消え去ります。

希望の方はこちら!

+0

if (dlg.ShowDialog(this) == DialogResult.OK) { // etc... } 

たとえばあなたが、オフに再起動したり、ログオフするかどうかを確認しながら、シャットダウンウィンドウ上でクリックしたときには、画面全体を暗くします。 – Nezreli

+0

@Nezreli上記のコードを使用するとアプリケーションが灰色に変わりますが、それ以外は何をしようとしているのか分かりません。 – 3aw5TZetdf

0

この方法の代替方法は、showDialogを隠す継承されたフォームインスタンスを使用することです。その後、現在のフォームバーをすべて無効にしたり有効にしたりすることができます。ダミーフォームのコードは、ここで説明する問題に対処することです。 Cannot fire form activate event - issue with disabled forms

このアプローチの利点の1つは、showDialogメソッドの通常の処理を変更する必要がないことです。ちょうどそれを呼んでください。あなたの継承されたフォーム

public abstract class MyBaseForm : XtraForm 
{ 
    private DialogResult setFormsToBackground(Form fParent) 
    { 
     Form dummyForm = new Form(); 
     dummyForm.ShowInTaskbar = false; 
     dummyForm.FormBorderStyle = FormBorderStyle.None; 
     dummyForm.Load += ((object sender, EventArgs e) => { (sender as Form).Size = new Size(0, 0); }); 

     List<Form> lstFormsToEnable = new List<Form>(); 
     for (int i = Application.OpenForms.Count - 1; i >= 0; i--) 
     { 
      try 
      { 
       Form checkfrm = Application.OpenForms[i]; 
       if (checkfrm != this && dummyForm != this && checkfrm.Enabled) 
       { 
        lstFormsToEnable.Add(checkfrm); 
        checkfrm.Enabled = false; 
       } 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
     dummyForm.Show(); 
     DialogResult result = DialogResult.None; 
     if (fParent == null) result = base.ShowDialog(); 
     else result = base.ShowDialog(fParent); 
     for (int i = lstFormsToEnable.Count - 1; i >= 0; i--) 
     { 
      try 
      { 
       Form checkfrm = Application.OpenForms[i]; 
       checkfrm.Enabled = true; 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
     dummyForm.Close(); 
     return result; 
    } 
} 
関連する問題