问题描述
类似某些播放器显示歌词的功能激活主窗体时,如果歌词窗口是打开的,那么歌词窗口会和主窗口一起变成顶端窗口再说准确一点,就是AB两窗体显示了出来,B是由A创建的然后另外一个程序的窗口把AB同时遮住了,这时候在任务栏里点击A的程序,那么A窗口会跑到所有窗口的最前面,但是B窗口不会同步跑上来。尝试使用过A窗口的Form_Activated事件,但是在事件绑定方法中将B激活或者隐藏再显示,虽然可以达到效果,但是A窗口将无法移动(因为我是边框样式用的None,然后通过左键在A窗体内部按下拖动进行窗口移动)有没有什么好的方法呢?
解决方案
解决方案二:
ShowDialog()
解决方案三:
Form2_Activated之后再执行Form1_Activated,让1重新获得焦点啊
解决方案四:
引用2楼Z65443344的回复:
Form2_Activated之后再执行Form1_Activated,让1重新获得焦点啊
这样肯定是个死循环。
解决方案五:
我怎么看你的意思好像就是普通的TopMost=true呢
解决方案六:
好吧,我再来总结一下我的问题。首先,主副两个窗体,边界都是NONE,副窗体跟着主窗体移动。因为主窗体FormBorderStyle属性设置成了None,所以为了移动窗体,我在MouseDownMouseMove和MouseUp事件中写了相应的代码。第二,我要实现主副窗体同时在顶部或者同时被第三个窗体所覆盖,即,主窗体在第三个窗体前面,而副窗口在第三个窗体后面这种情况要杜绝发生。一般来说,不做任何设置的话,先将第三个窗体把主副窗体都挡住,再激活主窗体,此时副窗体仍然在第三个窗体后面,需要将他激活,移动到第三个窗体前部。所以,此时,我想到的是借助于Form_Activated事件,代码如下:privatevoidfrm_Main_Activated(objectsender,EventArgse){if(!leftFlag)//leftflag是mouseupdown等事件里定义的,主要看左键是否按下状态,这里永远都是false,因为mousedown事件在activated事件之后才发生。{if(f2.Visible){f2.TopMost=true;f2.TopMost=false;}}}
然后我想说。。刚才我把f2.Show()改成了f2.Show(this),就把所有问题解决了。。我也是醉了。。
解决方案七:
activated事件会将f2激活,所以鼠标点击主窗体激活后,由于事件的关系,f2被激活,主窗体失去焦点,无法完成鼠标拖曳动作,窗体就无法移动了。引用5楼hxy00的回复:
好吧,我再来总结一下我的问题。首先,主副两个窗体,边界都是NONE,副窗体跟着主窗体移动。因为主窗体FormBorderStyle属性设置成了None,所以为了移动窗体,我在MouseDownMouseMove和MouseUp事件中写了相应的代码。第二,我要实现主副窗体同时在顶部或者同时被第三个窗体所覆盖,即,主窗体在第三个窗体前面,而副窗口在第三个窗体后面这种情况要杜绝发生。一般来说,不做任何设置的话,先将第三个窗体把主副窗体都挡住,再激活主窗体,此时副窗体仍然在第三个窗体后面,需要将他激活,移动到第三个窗体前部。所以,此时,我想到的是借助于Form_Activated事件,代码如下:privatevoidfrm_Main_Activated(objectsender,EventArgse){if(!leftFlag)//leftflag是mouseupdown等事件里定义的,主要看左键是否按下状态,这里永远都是false,因为mousedown事件在activated事件之后才发生。{if(f2.Visible){f2.TopMost=true;f2.TopMost=false;}}}然后我想说。。刚才我把f2.Show()改成了f2.Show(this),就把所有问题解决了。。我也是醉了。。
解决方案八:
引用5楼hxy00的回复:
好吧,我再来总结一下我的问题。首先,主副两个窗体,边界都是NONE,副窗体跟着主窗体移动。因为主窗体FormBorderStyle属性设置成了None,所以为了移动窗体,我在MouseDownMouseMove和MouseUp事件中写了相应的代码。第二,我要实现主副窗体同时在顶部或者同时被第三个窗体所覆盖,即,主窗体在第三个窗体前面,而副窗口在第三个窗体后面这种情况要杜绝发生。一般来说,不做任何设置的话,先将第三个窗体把主副窗体都挡住,再激活主窗体,此时副窗体仍然在第三个窗体后面,需要将他激活,移动到第三个窗体前部。所以,此时,我想到的是借助于Form_Activated事件,代码如下:privatevoidfrm_Main_Activated(objectsender,EventArgse){if(!leftFlag)//leftflag是mouseupdown等事件里定义的,主要看左键是否按下状态,这里永远都是false,因为mousedown事件在activated事件之后才发生。{if(f2.Visible){f2.TopMost=true;f2.TopMost=false;}}}然后我想说。。刚才我把f2.Show()改成了f2.Show(this),就把所有问题解决了。。我也是醉了。。
你前面不是说“B窗口不会同步跑上来”吗?要是一起跑上来就show(this)或者设置窗体的Owner属性都可以
解决方案九:
引用3楼hxy00的回复:
Quote: 引用2楼Z65443344的回复:
Form2_Activated之后再执行Form1_Activated,让1重新获得焦点啊这样肯定是个死循环。
加个变量控制啊如果是form1本身的代码使form1获得焦点,而不是用户点击鼠标或按下ctrl+tab,那么就不要让form2获得焦点了,不就得了
解决方案十:
当然设置父级窗体也是个办法