请问大家一个WinForm的问题:
主窗体Form里面,
一个按钮 new 了另一个form,
大概代码如下:
Form f = new Form()
Panel p = new Panel();
MainForm.Controls.Add(p);
f.TopLevel = false;
f.Dock = DockStyle.Fill;
 f.Parent = p;
f.Show();问题:Deactivate事件不能使用了,我知道整个过程父窗体并没有失去焦点。
我想在点击其它地方(不在子窗体控件内时)触发一个事件,像Deactivate类拟的,该如何做?

解决方案 »

  1.   

    在MainForm的Click里面判断是否在Panel空间里面呢?
      

  2.   


    好麻烦呀,我有三个这样的子窗体,MainForm每点击一次就要遍历是否点在Panel里面,再乘以3倍,这性能……
      

  3.   


            protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                if (msg.Msg >= 513 && msg.Msg <= 515 && msg.HWnd != this.Handle)
                {
                    MessageBox.Show("ok");
                    return true;
                }
                else
                {
                    return base.ProcessCmdKey(ref msg, keyData);
                }
            }
      

  4.   

    你写个方法,MainForm除了Panel所有的事件都引用这个方法不就行了,要判断什么
      

  5.   

    Control.Focus();
    可以获得焦点啊
      

  6.   

    上图吧。
    业务员下面的那个窗体,是一个Form来的,我想点击界面的其它地方(包括没有控件的),有个事件通知那Form关闭或隐藏。是这个意思。
      

  7.   

    Panel1_Leave()
    {
      Panel1.Hide();
    }
      

  8.   

    为什么不用
    Deactivate事件?你show出子窗体之后要把子窗体激活啊。不然怎么会触发Deactivate
      

  9.   

    子窗体loading时已经this.Activate();没用的。
    就是因为是Add进来的子窗体,Deactivate事件不会触发。
      

  10.   

    你给一个异步的Activate,同步当然没用
      

  11.   

    两种选择,
    1,show的过程中异步去激活子窗体Activate。
    2,show方法执行完毕之后再激活窗体Activate。
      

  12.   


    还是不会怎么去异步激活子窗体呀,
    例如:
    大概代码如下:
    Form f = new Form()
    Panel p = new Panel();
    MainForm.Controls.Add(p);
    f.TopLevel = false;
    f.Dock = DockStyle.Fill;
     f.Parent = p;
    f.Show();
    //////////////
    f.Activate();
    this.BeginInvoke(委托)
    这样么?????能否给一两行简单的代码示例