微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 PaintEvent 中有多个案例 - 使用 Timer

如何解决如何在 PaintEvent 中有多个案例 - 使用 Timer

我想在 PaintEvent 中使用多个 case,使用 Timer 切换:

protected override void OnPaint(PaintEventArgs e)
{
    switch (scene)
    {
        case 1:
            foreach (Tunnels Boxes in tunnellist)//draws series of Boxes,creating "tunneleffect" by looping using Invalidate();
            {
                Boxes.Draw(e.Graphics);
                Invalidate();
            }
            break;

        case 2:
            foreach (....//here I would like to have some other effect,for example drawing list of sprites moving using sine-waves etc.
            break;

        default:
            break;
    }
}

在计时器中我有以下内容(每 20 秒打勾):

private void timer1_Tick(object sender,EventArgs e)
{
    if (scene > 1)
    {
        scene = 1;
    }
    else
    {
        scene++;
    }
    this.Invalidate();
}

这里的问题是,因为我在 PaintEvent 中有 Invalidate(),所以计时器永远不会触发。任何想法如何解决这个问题?

解决方法

Control.Invalidate:

使控件的特定区域无效并导致向控件发送绘制消息。

为什么要在绘制事件处理程序中发送绘制消息?为什么不直接开始画画?

这在一定程度上取决于您正在痛苦的控制。你在同一个控件中绘制的框?然后绘制盒子就足够了。无需再次失效。

如果您想在与您现在正在绘制的控件不同的控件中绘制框,则不应使此控件无效,而应使必须在其中绘制框的控件无效。这将导致该控件的 Onpaint。使用该事件在没有 Invalidate 的情况下绘制 Boxes。

,

这里的问题是,如果我不在绘制事件中使用 Invalidate(),我最终会得到形成隧道的盒子的静态图片,即。没有动画。 我直接绘制到窗体画布(=控制)。

我尝试了一种解决方法,它有两个计时器,一个每 20 秒滴答一次(改变场景),另一个每 20 毫秒滴答一次(无效)。然而,这导致了抖动。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。