1

この記事と同じ効果を実現したいのですが、Windows フォームの場合、別のフォームでコントロールをホストしなくても可能ですか?

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

4

2 に答える 2

3

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はダイアログを閉じるタイミングを決定するために使用されます。ダイアログを表示するときに実行する必要があるのは次のとおりです。

  1. ラベルを設定する
  2. フォームを無効にします(ただし、ダイアログは無効にします)
  3. ダイアログを表示する
  4. ユーザーがボタンの1つをクリックするのを待ちます
  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;
    }
于 2011-08-08T10:02:21.463 に答える
0

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

于 2011-08-08T08:14:47.480 に答える