この記事と同じ効果を実現したいのですが、Windows フォームの場合、別のフォームでコントロールをホストしなくても可能ですか?
編集私は記事のコントロールの正確な動作を実装し、フォームにコントロールを表示し、呼び出し関数をブロックすることにもっと興味がありますが、この目的のために他のフォームを使用することはありません。
この記事と同じ効果を実現したいのですが、Windows フォームの場合、別のフォームでコントロールをホストしなくても可能ですか?
編集私は記事のコントロールの正確な動作を実装し、フォームにコントロールを表示し、呼び出し関数をブロックすることにもっと興味がありますが、この目的のために他のフォームを使用することはありません。
2つのボタンとメッセージのラベルを使用してUserControlを作成し、コンストラクターでその可視性をfalseに設定できます。
public MyDialog()
{
InitializeComponent();
Visible = false;
}
次に、3つの変数をコントロールに追加します。
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;
}
真ん中に不透明な形のテキストを含む透明なフォームを作成するのはどうですか (好きなものは何でも)。次に、実行時にこのフォームのサイズを変更して、表示するウィンドウと同じサイズにし、それを覆うように配置します。