2011-08-08 6 views
1

thisの記事のように同じ効果を達成したいと思いますが、Windowsフォームの場合は、別のフォームのコントロールをホストしなくても可能ですか?Winforms UserControlのShowDialogをエミュレートする

EDIT 私はフォームのコントロールを表示し、呼び出し関数をブロックしながら、この目的のために他のフォームを使わずに、コントロールの正確な動作を実装することにもっと興味があります。

答えて

3

あなたはコンストラクタでfalseにその可視性を設定し、その後、メッセージのための2つのボタンを持つユーザーコントロールとラベルを作成することができます。

public MyDialog() 
    { 
     InitializeComponent(); 
     Visible = false; 
    } 

そして、あなたがコントロールする三つの変数を追加します。

Form _parent; 
    bool _result; 
    bool _clicked = false; 

親フォームは、コントロールが含まれているフォームになります。コントロールを使用する前に、何を無効にする必要があるかを知る必要があるため、コントロールを設定する必要があります。

public void SetParent(Form f) 
    { 
     _parent = f; 
    } 

_resultにはダイアログの結果が含まれ、_clickedはダイアログを閉じるタイミングを決定するために使用されます。あなたはあなたのダイアログを表示したときに行われなければならないことは次のとおりです。

  1. は、ラベル
  2. 、1つをクリックするユーザーのためのダイアログ表示
  3. 待機させるフォーム(ただし、ダイアログ)
  4. を無効に設定しましたボタンの
  5. は、ダイアログ
  6. が親フォームに
  7. リターン結果を再度有効に隠す

ですから、親フォームを無効/有効にするには、このメソッドを追加することができます。

private void ParentEnabled(bool aBool) 
    { 
     if (_parent == null) 
      return; 
     foreach (Control c in _parent.Controls) 
      if (c != this) 
       c.Enabled = aBool; 
    } 

とShowDialogメソッドでそれを使用する:

public bool ShowDialog(string msg) 
    { 
     if (_parent == null) 
      return false; 
     // set the label 
     msgLbl.Text = msg; 
     // disable the form 
     ParentEnabled(false); 
     // make the dialog visible 
     Visible = true; 
     // wait for the user to click a button 
     _clicked = false; 
     while (!_clicked) 
     { 
      Thread.Sleep(20); 
      Application.DoEvents(); 
     } 
     // reenable the form 
     ParentEnabled(true); 
     // hide the dialog 
     Visible = false; 
     // return the result 
     return _result; 
    } 

が明らかにボタンが_resultを設定する責任があります_clicked変数:

private void okBtn_Click(object sender, EventArgs e) 
    { 
     _result = true; 
     _clicked = true; 
    } 
    private void cancelBtn_Click(object sender, EventArgs e) 
    { 
     _result = false; 
     _clicked = true; 
    } 
+0

悪いです。 while(!clicked)は醜いです。それは 'ダイアログ'を閉じるべきボタンです。 –

+0

OK、あなたはそれをしていません(私も同じことですが)。ボタンをクリックした後でのみ、どのようにShowDialogが戻るでしょうか? –

+0

可能かどうかわかりません。そのため、ShowDialog()で表示する透明なフォームにする必要があります。 –

0

真ん中に不透明な形のテキスト(好きなもの)が含まれている透明なフォームを作成することはどうでしょうか。次に実行時に、このフォームのサイズを、表示するウィンドウと同じサイズにして、それをカバーするように配置します。

関連する問題