thisの記事のように同じ効果を達成したいと思いますが、Windowsフォームの場合は、別のフォームのコントロールをホストしなくても可能ですか?Winforms UserControlのShowDialogをエミュレートする
EDIT 私はフォームのコントロールを表示し、呼び出し関数をブロックしながら、この目的のために他のフォームを使わずに、コントロールの正確な動作を実装することにもっと興味があります。
thisの記事のように同じ効果を達成したいと思いますが、Windowsフォームの場合は、別のフォームのコントロールをホストしなくても可能ですか?Winforms UserControlのShowDialogをエミュレートする
EDIT 私はフォームのコントロールを表示し、呼び出し関数をブロックしながら、この目的のために他のフォームを使わずに、コントロールの正確な動作を実装することにもっと興味があります。
あなたはコンストラクタでfalseにその可視性を設定し、その後、メッセージのための2つのボタンを持つユーザーコントロールとラベルを作成することができます。
public MyDialog()
{
InitializeComponent();
Visible = false;
}
そして、あなたがコントロールする三つの変数を追加します。
Form _parent;
bool _result;
bool _clicked = false;
親フォームは、コントロールが含まれているフォームになります。コントロールを使用する前に、何を無効にする必要があるかを知る必要があるため、コントロールを設定する必要があります。
public void SetParent(Form f)
{
_parent = f;
}
_resultにはダイアログの結果が含まれ、_clickedはダイアログを閉じるタイミングを決定するために使用されます。あなたはあなたのダイアログを表示したときに行われなければならないことは次のとおりです。
ですから、親フォームを無効/有効にするには、このメソッドを追加することができます。
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;
}
真ん中に不透明な形のテキスト(好きなもの)が含まれている透明なフォームを作成することはどうでしょうか。次に実行時に、このフォームのサイズを、表示するウィンドウと同じサイズにして、それをカバーするように配置します。
悪いです。 while(!clicked)は醜いです。それは 'ダイアログ'を閉じるべきボタンです。 –
OK、あなたはそれをしていません(私も同じことですが)。ボタンをクリックした後でのみ、どのようにShowDialogが戻るでしょうか? –
可能かどうかわかりません。そのため、ShowDialog()で表示する透明なフォームにする必要があります。 –