WinForm里子窗体如何失去焦点事件?

时间:2022-10-21 17:31:02
请问大家一个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类拟的,该如何做?

24 个解决方案

#1


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

#2


引用 1 楼  的回复:
在MainForm的Click里面判断是否在Panel空间里面呢?


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

#3


有没有人有更好的答案呀?

#4



        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);
            }
        }

#5


引用 4 楼  的回复:
C# code

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (msg.Msg >= 513 &amp;&amp; msg.Msg <= 515 &amp;&amp; msg.HWnd != this.Handle)
         ……


这个我放在子窗体里,进都不进来呀?

#6


朋友们,帮帮忙吧 

#7


该回复于2012-05-15 14:59:25被版主删除

#8


不能让贴子沉呀,问题还没有解决!!!

#9


问题还没有解决,不能让帖子沉下去~~`

#10


第三天了,有知道的朋友吗?帮帮忙吧。

#11


引用 2 楼  的回复:
引用 1 楼  的回复:

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


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

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

#12


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

#13


上图吧。
WinForm里子窗体如何失去焦点事件?

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

#14


怎么搞了个小图,再传一次。
WinForm里子窗体如何失去焦点事件?

#15


Panel1_Leave()
{
  Panel1.Hide();
}

#16


引用 15 楼  的回复:
Panel1_Leave()
{
  Panel1.Hide();
}

这事件唯一不满足的就是点窗体空白地方不会进触发~~

#17


这个星期再没人回答就关帖了

#18


为什么不用
Deactivate事件?

你show出子窗体之后要把子窗体激活啊。不然怎么会触发Deactivate

#19


引用 18 楼  的回复:
为什么不用
Deactivate事件?

你show出子窗体之后要把子窗体激活啊。不然怎么会触发Deactivate

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

#20


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

#21


引用 20 楼  的回复:
你给一个异步的Activate,同步当然没用

求指点,我还没理解。。。

#22


引用 21 楼  的回复:
引用 20 楼 的回复:

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

求指点,我还没理解。。。

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

#23


引用 22 楼  的回复:
引用 21 楼  的回复:
引用 20 楼 的回复:

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

求指点,我还没理解。。。

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


还是不会怎么去异步激活子窗体呀,
例如:
大概代码如下:
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(委托)
这样么?????能否给一两行简单的代码示例

#24


唉,看下快要无满意答案结帖了

#1


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

#2


引用 1 楼  的回复:
在MainForm的Click里面判断是否在Panel空间里面呢?


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

#3


有没有人有更好的答案呀?

#4



        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);
            }
        }

#5


引用 4 楼  的回复:
C# code

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (msg.Msg >= 513 &amp;&amp; msg.Msg <= 515 &amp;&amp; msg.HWnd != this.Handle)
         ……


这个我放在子窗体里,进都不进来呀?

#6


朋友们,帮帮忙吧 

#7


该回复于2012-05-15 14:59:25被版主删除

#8


不能让贴子沉呀,问题还没有解决!!!

#9


问题还没有解决,不能让帖子沉下去~~`

#10


第三天了,有知道的朋友吗?帮帮忙吧。

#11


引用 2 楼  的回复:
引用 1 楼  的回复:

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


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

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

#12


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

#13


上图吧。
WinForm里子窗体如何失去焦点事件?

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

#14


怎么搞了个小图,再传一次。
WinForm里子窗体如何失去焦点事件?

#15


Panel1_Leave()
{
  Panel1.Hide();
}

#16


引用 15 楼  的回复:
Panel1_Leave()
{
  Panel1.Hide();
}

这事件唯一不满足的就是点窗体空白地方不会进触发~~

#17


这个星期再没人回答就关帖了

#18


为什么不用
Deactivate事件?

你show出子窗体之后要把子窗体激活啊。不然怎么会触发Deactivate

#19


引用 18 楼  的回复:
为什么不用
Deactivate事件?

你show出子窗体之后要把子窗体激活啊。不然怎么会触发Deactivate

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

#20


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

#21


引用 20 楼  的回复:
你给一个异步的Activate,同步当然没用

求指点,我还没理解。。。

#22


引用 21 楼  的回复:
引用 20 楼 的回复:

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

求指点,我还没理解。。。

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

#23


引用 22 楼  的回复:
引用 21 楼  的回复:
引用 20 楼 的回复:

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

求指点,我还没理解。。。

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


还是不会怎么去异步激活子窗体呀,
例如:
大概代码如下:
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(委托)
这样么?????能否给一两行简单的代码示例

#24


唉,看下快要无满意答案结帖了