Winform中如何让控件置顶

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Winform中如何让控件置顶相关的知识,希望对你有一定的参考价值。

我想做一个找茬的游戏,想实现一个屏幕切换的效果,就是像Win8一样的滑动翻页效果,现在我们还没学Winform的动态效果,整天就是些静态丑陋的窗体,昨天晚上突然突发奇想能不能用循环来做这个效果,然后通过Sleep()方法来设置间隔循环时间,这样会不会有移动的效果?
今天试了试虽然可以,但是弊端太多太多,第一:当指定的控件开始滑动时,整个窗体是处于无响应状态的,点什么都没反应;第二:某些位置的控件会被移动的控件挤出窗体可视范围;
下面是我的代码和效果图:
int Count = 0;
private void button10_Click(object sender, EventArgs e) if (Count > 0) return; Count += 1; int Btn_Left = this.button10.Left; for (int i = 0; i < 100; i++) Thread.Sleep(100); this.panel1.Left -= i; this.button10.Left = Btn_Left;
注:button10是那个按钮,当按钮被单击时滑动开始;
panel1是滑动体,里面包含了若干的按钮控件。

求大神帮忙解决,或者有更好的办法来实现这一效果。
是Winform的,不是WPF的,GDI重绘控件我还不会,因为目前为止学习的都还很浅,大部分时间都在学数据库的操作,没有学Winform窗体的各种效果的实现方式,当然也没有接触过GDI了。。。
有没有简单易理解的办法呢?
新手再次拜求各位大神。。。

参考技术A

试试在Load事件中加上这句话:

button10.BringToFront();

追问

这句话解决了第二个弊端,这句话是啥意思?控件置顶?应该不会。
求解答。。。。

追答

不好意思,我以为你的弊端只是阐述一下,刚才没太在意...

关于假死状态,那是因为你的是单一线程的原因吧。

所有的操作都在主线程里完成的话需要排队,所以就假死了。

关于第一个问题的解决方案:

1.直接用Timer,Timer这个东西是一个多线程的代表,你可以尝试吧某些需要一定时间的功能单独放在一个timer里实现(比如说移动控件)
2.用多线程异步的常规思路

关于BringToFront()

这个的解释我就不多说了,因为我的理解也不深入,你可以去网上查一下资料,免得我误导你。

追问

没关系,那么怎样用Timer来解决这个问题呢?我在Timer这里了解的不多,就是见组长用过,只知道是按间隔一定的时间执行一次,刚才去看来百科的关于线程的简介,一头雾水,怎样运用Timer来解决那个假死的问题呢?现在没有一点头绪,求教....

追答

首先,timer是一个控件..你可以直接从工具栏里面拖到窗体中,然后双击,就跳转到了timer的事件里。


个人对timer的理解:

他就像是在主程序(主线程)的基础上,有额外添加了一个小线程。
本质就像是个循环,可以设置他的周期速度(每多少秒走一次timer的事件)
需要用timer1.Enable=true;来启动它
用timer1.Enable=false;来关闭它
用完了回收了

总结:你可以吧timer理解为循环能的东西,里面想些什么都可以。

本回答被提问者采纳
参考技术B 第一,想解决界面假死的问题,所有对界面控件的移动操作都要放到子线程中,并且invoke,请自行搜索相关知识。
第二,button10不是被挤了,是被你的panel挡住了。

Winform在线程中怎么让MessageBox显示置顶

参考技术A 使用环境变量就行咯..... Dim xy(99) DimEnv a i=0 for 100 xy(i)=i i=i+1 next a=xy(88) BeginThread 测试 EndScript Sub 测试() MessageBox a End Sub本回答被提问者采纳

以上是关于Winform中如何让控件置顶的主要内容,如果未能解决你的问题,请参考以下文章

Winform在线程中怎么让MessageBox显示置顶

在winform中如何让图片控件根据键盘来移动

winform中如何让控件随窗口按比例缩放

如何让一个winform自带的控件拥有和devexpress一样的皮肤功能

如何在winform中创建个新控件,让这个新控件指向已创建的控件

C# winform 程序,在用SaveFileDialog选择完路径后,主界面如何置顶?