winform主副窗体显示(同时跑到所有窗口顶层)的问题

问题描述

类似某些播放器显示歌词的功能激活主窗体时,如果歌词窗口是打开的,那么歌词窗口会和主窗口一起变成顶端窗口再说准确一点,就是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获得焦点了,不就得了
解决方案十:
当然设置父级窗体也是个办法

时间: 2024-09-16 22:03:52

winform主副窗体显示(同时跑到所有窗口顶层)的问题的相关文章

winform中的窗体显示问题~

问题描述 打开A.EXE文件后通过1号窗体showDiogle出2号窗体,此时当我打开其他程序后,鼠标点WIN系统的任务栏想要显示A.EXE时,无法显示以showDiogle出来的2号窗体,只显示1号窗体,该如何解决这个问题?? 解决方案 解决方案二:你的showDiogle是在哪里调用的?你要是在load的时候调用当然不行啦,你要在1号窗体的Actived回调函数中调用showDiogle才行.解决方案三:showModalDialog用这个就可以了解决方案四:用法和showDiogle这个一

winform点击某个按钮,主窗体和子窗体都显示,子窗体显示在最上面

问题描述 winform点击某个按钮,主窗体和子窗体都显示,子窗体显示在最上面 winform点击某个按钮,主窗体和子窗体都显示,子窗体显示在最上面 解决方案 showdialog()showdialog()showdialog()showdialog() 解决方案二: 子窗体.BringToFront()

在做c# winform 主窗体开了两个窗体Form,希望两个窗体的定时器同步进行

问题描述 在做c# winform 主窗体开了两个窗体Form,希望两个窗体的定时器同步进行 在做c# winform 主窗体开了两个窗体Form(窗体里面有个定时器Forms.timer),希望两个窗体的定时器同时进行,可是执行的时候第二个执行完成,第一个才开始执行,没有两个一起执行的效果,如何解决,c#的三个线程我都试过,不好用,谁有好的解决方法?求大神 主窗体button1按钮,开了两个相同的form2 private void button1_Click(object sender, E

WinForm窗体显示和窗体间传值总结

WinForm 2009-02-10 10:47:47 阅读50 评论0 字号:大中小 A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 两者具体区别如下: 1.在调用Form.Show方法后,Show方法后面的代码会立即执行 2.在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码 3.当窗体显示为模式窗体时,单击"关闭"按钮会隐藏窗

winform从Access读取数据,Windows窗体显示数据为什么有<div>标签?如何去掉?

问题描述 winform从Access读取数据,Windows窗体显示数据为什么有<div>标签?如何去掉? 解决方案 div是网页数据,看来是你数据库存入的时候是网页数据,所以你读取出来后,可能要自己截去 解决方案二: 一,查看Access数据存储是否含有div标签 二,winform页面中是否误写了div

c# Winform 开发分屏显示应用程序

原文 http://blog.csdn.net/soft2buy/article/details/7082668 分屏显示即可把一台主机内运行的多个程序分别显示在不同的两个(或多个)屏幕上.目前市面上主流的显卡都支持分屏显示(显示双屏幕),如果需要显示2个以上的屏幕,则应使用"拖机卡"类的硬件. 设置分屏显示的两种方法如下: 1.用两个显卡连接两台显示器,进入系统后,分清楚哪一个是主显卡,在桌面空白处右键单击,点属性,然后在窗口中点"设置"选项卡,会看到有两个显 示

窗体显示问题-MDI子窗体最大化显示问题

问题描述 MDI子窗体最大化显示问题 在MDI子窗体 1.放了一个菜单 Me.MenuStrip1 .Dock =DockStyle.Top: 设置"窗口"菜单存放子窗体标题 Me.MenuStrip1.MdiWindowListItem = 窗口ToolStripMenuItem: 2.放了一个Panel1控件 Me.Panel1 .Dock =DockStyle.Fill: 3.在Panel控件上放了一个按钮,用于打开一个子窗体,click事件代码为: Dim frm As For

wpf-c#代码设置WPF窗体显示到第二个显示屏

问题描述 c#代码设置WPF窗体显示到第二个显示屏 想在WPF窗体界面放二个按钮,显示屏幕1 显示屏幕2 当我点击按钮 显示屏幕1 窗体全屏显示在 主屏幕 : 相反,当我点击 显示屏幕2 就显示在 第二个屏幕去...! 解决方案 参考: using System.Linq; using System.Windows; namespace ExtendedControls { static public class WindowExt { // NB : Best to call this fun

c# winform datagridview 跨窗体传值的问题

问题描述 c# winform datagridview 跨窗体传值的问题 图1 是显示从数据库中拿到 datagridview 中的内容 图2是显示的效果 图三是新窗体打开 (已获取选中行ID) 图四 我怎么选中一行 点击修改 然后把选那行的值 全部显示在新窗体上呢? 解决方案 C#_WinForm窗体传值 解决方案二: 你可以创建一个model,这个model的字段就是你要传的参数值,然后如下:add _add=new add(model _model):就可以了.意思就是利用有参呢构造参数