winform怎样显示一个活动的类似滚动进度条的窗体

Hello_Winter 2017-06-01 10:10:08
form1为主窗体,form2自己做的类似滚动进度条的窗体,问一下为什么实例化的form中的进度条不滚动。求大神解释,代码在下面
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool Dir = true;
Form2 form = new Form2();
private void timer1_Tick(object sender, EventArgs e)
{
int x =form.Location.X;
if (x < 0)
Dir = true;
if (x < form.panel1.Size.Width - form.pictureBox1.Size.Width && Dir)
{
x = x + 15;
form.pictureBox1.Location = new Point(x, -1);
Application.DoEvents();
}
else
{
Dir = false;
x = x - 15;
form.pictureBox1.Location = new Point(x, -1);
Application.DoEvents();
}

}

private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
form.ShowDialog();
}
}
}
...全文
290 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdashewan 2017-06-01
  • 打赏
  • 举报
回复
引用 2 楼 Hello_Winter 的回复:
频率 1s,其实我也不太懂 doevent()的作用,
频率固定可以使用System.Threading.Timer类https://msdn.microsoft.com/zh-cn/library/system.threading.timer(v=vs.110).aspx
Hello_Winter 2017-06-01
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
timer1频率多少?太快就用线程方式,还有去掉你的那些Application.DoEvents();
频率 1s,其实我也不太懂 doevent()的作用,
xdashewan 2017-06-01
  • 打赏
  • 举报
回复
timer1频率多少?太快就用线程方式,还有去掉你的那些Application.DoEvents();
  • 打赏
  • 举报
回复
上面只是一个很表面的问题。这个程序设计的设计的“问题”相当相当多。
  • 打赏
  • 举报
回复
你用鼠标向 Form2 中拖入一个 Timer 控件,然后设置其 Modifier 为 public,然后在 Form1 中应该捕获其事件。例如
Form2 form = new Form2();

private void Form1_Load(object sender, EventArgs e)
{
    form.timer1.Tick += Timer1_Tick;
}

private void Timer1_Tick(object sender, EventArgs e)
{
    int x = form.Location.X;
    .................
}
如果 Form2 设计的时候更加注重业务接口封装,而不是动不动就暴露什么控件,并且 Form2 应该尽量独立完成核心的功能,那么更好。
  • 打赏
  • 举报
回复
这是职责混乱造成的问题。 timer 是 form(Form2)里边的东西,被你拿到 Form1 里边执行,然后 Form1 又使用 ShowDialog 语句,这样乱上加乱,就又不惜打乱 windows 消息泵的正确次序而使用 Application.DoEvents。 你的 timer 应该是 Form2 里边的东西,就算是你打算从 Form1 中为其每一次显示而设置什么东西,那么也应该是 Form2(也就是 form)抛出事件,Form1的实例中捕获事件来设置其 pictureBox1 的状态。关键点就在于这个行为的出发点是 Form2 发起的,你在 Form1 中把矛盾的东西堆在一起了。
xuzuning 2017-06-01
  • 打赏
  • 举报
回复
Application.DoEvents() 的作用是交还被占用的控制权,以使主线程能够响应其他事件 在你的应用中,并没有交还控制权的必要。timer1_Tick() 结束后自然就回到了主线程 ShowDialog() 是以模态方式显示窗体 既然是模态窗体,那么在他关闭之前,其他窗体(包括主窗体)都将被挂起 自然就不可能有进度条的变化了 你应该 form.Show(); 这样显示窗体 并设置 form.TopMost = true; 以免窗体被其他窗体挡住
xian_wwq 2017-06-01
  • 打赏
  • 举报
回复
doevent是为了刷新主线程,防止UI卡死 所以要解决问题,使用线程,刷新时使用委托 如果委托不熟悉, 使用backgroudworker也可以实现类似功能

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧