0

メソッドを使用するFocus()と、対象のフォームがフォーカスを取得しますが、他のフォームの前にも表示されます。

この z オーダーの変更を回避する方法はありますか?

以下に短い例を示します。

class MyForm : Form
{
    static void Main(string[] args)
    {
        MyForm f1 = new MyForm()
        {
            Text = "f1"
        };
        f1.Show();

        MyForm f2 = new MyForm()
        {
            Text = "f2"
        };
        f2.Show();

        Button b1 = new Button();
        b1.Click += (sender, e) => f2.Focus();
        f1.Controls.Add(b1);

        Button b2 = new Button();
        b2.Click += (sender, e) => f1.Focus();
        f2.Controls.Add(b2);

        Application.Run(f1);
    }
}

のボタンをクリックすると、f1フォーカスf2が得られますが、前にも表示されますf1(これは避けたいことです)。

4

1 に答える 1

0

それが最善の方法かどうかはよくわかりませんが、最終的に所有者プロパティを使用しました:

class MyForm : Form
{
    public const int WM_NCLBUTTONDOWN = 0x00A1;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_NCLBUTTONDOWN:
                TakeFocus();
                base.WndProc(ref m);
                break;

            default:
                base.WndProc(ref m);
                break;
        }
    }

    private void TakeFocus()
    {
        if (Owner == null && OwnedForms.Length > 0)
        {
            Form tmp = OwnedForms[0];
            tmp.Owner = null;
            Owner = tmp;
        }
        BringToFront();
    }

    static void Main(string[] args)
    {
        MyForm f1 = new MyForm()
        {
            Text = "f1",
        };
        f1.Show();

        MyForm f2 = new MyForm()
        {
            Text = "f2",
        };
        f2.Owner = f1;
        f2.Show();

        Button b1 = new Button();
        b1.Click += (sender, e) =>
        {
            f1.TakeFocus();
        };
        f1.Controls.Add(b1);

        Button b2 = new Button();
        b2.Click += (sender, e) =>
        {
            f2.TakeFocus();
        };
        f2.Controls.Add(b2);

        Application.Run(f1);
    }
}

この例では、クライアント領域をクリックすると、他のウィンドウの前に移動することなく、ウィンドウがフォーカスを取得します。非クライアント領域 (タイトルバーと境界線) またはボタンをクリックすると、フォームがフォーカスを得て前面に表示されます。

于 2016-12-16T10:23:25.667 に答える