C # - Прямоугольник мерцает анимация - PullRequest
2 голосов
/ 10 октября 2011

Я пытаюсь создать простую анимацию прямоугольника. Анимация очень проста: прямоугольник имеет начальный размер 1 x 400 пикселей, и с помощью таймера я увеличиваю его на 4 пикселя каждые 25 мс. Но анимация мерцает, я устанавливаю форму с двойной буферизацией, но это не помогает вообще. Кажется, мне нужно установить это свойство для прямоугольника, но в классе прямоугольника нет свойства двойной буферизации :(. Есть ли способ обойти это?

Код формы:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        animation_timer.Start();
    }

    private void animation_timer_Tick(object sender, EventArgs e)
    {
        rect.Width+=4;
        if (rect.Width > 778)
        {
            animation_timer.Stop();
        }
    }
}

Код дизайнера:

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.shapeContainer1 = new Microsoft.VisualBasic.PowerPacks.ShapeContainer();
        this.rect = new Microsoft.VisualBasic.PowerPacks.RectangleShape();
        this.animation_timer = new System.Windows.Forms.Timer(this.components);
        this.SuspendLayout();
        // 
        // shapeContainer1
        // 
        this.shapeContainer1.Location = new System.Drawing.Point(0, 0);
        this.shapeContainer1.Margin = new System.Windows.Forms.Padding(0);
        this.shapeContainer1.Name = "shapeContainer1";
        this.shapeContainer1.Shapes.AddRange(new   

        Microsoft.VisualBasic.PowerPacks.Shape[] {
        this.rect});
        this.shapeContainer1.Size = new System.Drawing.Size(784, 562);
        this.shapeContainer1.TabIndex = 0;
        this.shapeContainer1.TabStop = false;
        // 
        // rect
        // 
        this.rect.FillColor = System.Drawing.Color.Black;
        this.rect.FillStyle = Microsoft.VisualBasic.PowerPacks.FillStyle.Solid;
        this.rect.Location = new System.Drawing.Point(5, 66);
        this.rect.Name = "rect";
        this.rect.Size = new System.Drawing.Size(1, 400);
        // 
        // animation_timer
        // 
        this.animation_timer.Interval = 25;
        this.animation_timer.Tick += new       
        System.EventHandler(this.animation_timer_Tick);
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(784, 562);
        this.Controls.Add(this.shapeContainer1);
        this.DoubleBuffered = true;
        this.Name = "Form1";
        this.Text = "Form1";
        this.ResumeLayout(false);

    }

1 Ответ

2 голосов
/ 10 октября 2011

Обычно вы бы включили двойную буферизацию, однако кажется, что это может быть невозможно: @ Hans Passant предлагает это касается PowerPacks.Shape

Это довольно некорректно. Он использует свое собственное окно, которое накладывается на форму с включенным стилем WS_EX_TRANSPARENT. Этот стиль делает его невидимым, но также препятствует правильной работе любой двойной буферизации. Двойная буферизация формы не действует, неправильное окно.

В остальном это довольно дорогой способ рисовать фигуры. Дешевый и не мерцающий способ заключается в использовании e.Graphics.FillRectangle () в переопределении формы OnPaint () или обработчике события Paint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...