在显示mdi子项后,将焦点设置为mdi容器

时间:2014-07-27 12:39:35

标签: c# winforms mdi

我正在尝试创建一个MDI容器的表单,当我按下numpad(1-9)上的按钮时,一个小表单(将成为表单的MDI子)将出现在相对位置到小键盘中数字的位置(5位于中间,9位于右上方),然后我希望程序的焦点返回到mdi容器,这样你就可以再次按下按钮。

我在MDI容器中设置了一个按键事件,如下所示:

private void MdiClient_KeyPress(object sender, KeyPressEventArgs e)
        {
            int num;
            if (e.KeyChar >= '1' && e.KeyChar <= '9')
            {
                num = e.KeyChar - '0';
                PhysicalChild pc = new PhysicalChild();
                pc.MdiParent = this;
                pc.Show();
                pc.Location = new Point(num % 3 * Width / 2 - 50 * num, num / 3 * Height / 2 - 50 * num);
                pc.Size = new Size(50, 50);
                Focus();
            }
        }

问题是它没有将焦点返回到MDI容器,即使我单击容器区域上的鼠标,我也必须关闭MDI子节点才能接收更多按钮。

我做错了什么,应该如何解决?

感谢。

2 个答案:

答案 0 :(得分:1)

从我读过的内容来看,当有MDI子表单时,它们将始终具有焦点。当没有可以保持焦点的子表单时,MDI父级只获得焦点。

但是,从我读过here关于子窗口的内容来看,您可以将子窗口上的父窗口属性更改为Null。这将使孩子与父母分离......这应该会使你的MDI窗口再次无子女。 (免责声明:我还没有尝试过这个,所以我不知道它是否会解决你的问题。)

如果这不起作用,MDI窗口可能不是您的应用程序的最佳解决方案。 MDI窗口通常是空容器,除了菜单:它们不具有自己的内容。

答案 1 :(得分:0)

您的代码非常完美,并且焦点会返回到mdiParent。 问题在于你的孩子加载尝试清空它然后再次尝试你的代码它就像一个魅力。 我做了测试。

您的准则必须如下:

 public partial class  PhysicalChild : Form
    {
        public  PhysicalChild()
        {
            InitializeComponent();
        }

        private void PhysicalChild_Load(object sender, EventArgs e)
        {
            MessageBox.Show(this.MdiParent.Text );
        }
    }