【问题标题】:How can I change PictureBox size incrementally and smoothly ? ( in winforms , c# , visual studio 2013 )如何逐步平滑地更改 PictureBox 大小? (在winforms、c#、visual studio 2013中)
【发布时间】:2014-07-31 04:48:00
【问题描述】:

我的表单中有一个 Button 和一个宽 290 高 145 的 PictureBox,最初是隐藏的。我想在按钮的 MouseEnter 事件发生时一点一点地显示 PictureBox。所以我尝试了这段代码:

private void button1_MouseEnter(object sender, EventArgs e)
{
    pictureBox1.Size = new Size(0, 145);
    pictureBox1.Show();
    for (int i = 0; i < 290; i++)
        pictureBox1.Size = new Size(i, 145);
}

但它会立即以主要尺寸显示图片框。

我在这个网站 (PictureBox does not change its size) 发现了一个类似的问题,但实际上它的答案也帮不了我。

【问题讨论】:

  • 一个计时器!,所以你可以在你的循环中制作delay
  • 代码运行速度如此之快,以至于您看不到中间步骤。

标签: c# winforms picturebox


【解决方案1】:

您的代码一次执行,所以您所看到的只是突然的变化。

使用计时器并在计时器滴答时逐渐增加大小。

timer = new Timer(16); //~60 FPS
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

...

private void button1_MouseEnter(object sender, EventArgs e)
{
    pictureBox1.Size = new Size(0, 145);
    pictureBox1.Show();

    timer.Enabled = true; // Enable it
}

...

private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    if (pictureBox1.Width < 290)
        pictureBox1.Width++; //Increment
    else
        timer.Enabled = false; //Disable
}

【讨论】:

  • 您的代码有一些问题。由于错误的重载,第一行有错误。 Elapsed 、 ElapsedEventHandler 和 ElapsedEventArgs 也有错误,因为找不到它们。我只是在表单中拖了一个计时器,并通过属性框更改了间隔。接下来,我像您一样在 button1_MouseEnter 中启用了计时器,并且我在 timer_Tick 而不是 timer_Elapsed 中写了您的最后四行。实际上, timer 的属性框中没有任何事件,除了 Tick ,我认为这些错误是因为它。但是,现在 PictureBox 显示为我想要的,谢谢。
  • 确保您使用using System.Timers,并且不要费心使用Form Creator 来拖拽计时器,只需像我一样将其编码即可。
  • 我使用 System.Timers 添加了,但它不再起作用了。如果我在表单中拖动计时器会出现什么问题?
  • 没问题,我发现只是编码更容易,通常不会将计时器视为控件。
【解决方案2】:

您必须使用pictureBoxUpdate 方法才能重绘它。在 Faster 计算机上稍稍延迟也会更顺畅地更改大小。

我这样修改了你的代码:

private void button1_MouseEnter(object sender, EventArgs e)
{
    pictureBox1.Size = new Size(145, 145);            
    for (int i = 145; i < 290; i++)
    {
        pictureBox1.Size = new Size(i, i);
        pictureBox1.Update();
        System.Threading.Thread.Sleep(1);
    }
}

【讨论】:

    【解决方案3】:

    1) 将新的 int 定义为 public :

    public partial class Form1 : Form
        {
            int counter = 0;
    .
    .
    .
    

    2) 使用计时器:

     private void timer1_Tick(object sender, EventArgs e)
            {
                counter = counter + 10;
                timer1.Interval = 10;
                pictureBox1.Show();
                if (counter <= 290)
                { pictureBox1.Width += 1; }            
            }
    

    3) 在鼠标事件中启用定时器:

    private void button1_MouseEnter(object sender, EventArgs e)
    {
        counter = 0;
        pictureBox1.Width = 0;
        timer1.Enabled = true;
    }
    

    【讨论】:

    • -1 表示不禁用计时器。我编辑了你的答案,但你不在乎。
    • 因为经过测试,定时器不需要停止。
    • 虽然 timer1_Tick 事件中的 if 条件 会给提问者她想要的东西,但是该事件被永远调用并调用 pictureBox1 .Show()2 个任务。这导致项目朝着非优化和非标准的方向发展。这就是为什么最好在事件内部出现第一个错误条件后关闭计时器。
    • @MatinLotfaliee 你不能给程序员规定定时器的休息时间,请让他们自己选择,你必须给出基本的答案。例如,我特意添加了 timer_interval 来指定图片增长速度(因为这是必要的)。
    • 最好的基本答案是“使用计时器。”,这在 cmets 中有提到。我不称您的回答是基本的,您已经详细说明了。稍微修改您的答案,以消除反对票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多