1

Windows フォームの場所を異なる速度でスムーズにアニメーション化する方法は?

しかし、何らかの理由で、私の this.Invalidate() 呼び出しは OnPaint イベントを起動しません。これを可能にするためにフォームに必要な構成はありますか?

編集:

独自のメッセージ ループを使用してバックグラウンド ワーカーで実行されるため、スレッド化が必要です。コードは次のとおりです。

public class PopupWorker
{
    public event PopupRelocateEventHandler RelocateEvent;

    private BackgroundWorker worker;
    private MyPopup popupForm;

    public PopupWorker()
    {
        worker = new BackgroundWorker();
        worker.DoWork += worker_DoWork;
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        popupForm = PopupCreator.CreatePopup("Title", "BodyText");
        this.RelocateEvent += popupForm.OnRelocate;
        popupForm.CustomShow();
        Application.Run();
    }

    public void Show()
    {
        worker.RunWorkerAsync();
    }

    public void PopupRelocate(object sender, Point newLocation)
    {
        if (popupForm.InvokeRequired)
            popupForm.Invoke(new PopupRelocateEventHandler(PopupRelocate), new object[] {sender, newLocation});
        else
            RelocateEvent(this, newLocation);
    }
}

形 :

public void OnRelocate(object sender, Point newLocation)
{
    targetLocation = newLocation;
    this.Invalidate();
}

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    if (Location.Y != targetLocation.Y)
    {
        Location = new Point(Location.X, Location.Y + 10);
        if (Location.Y > targetLocation.Y)
            Location = targetLocation;
        this.Invalidate();
    }
}
4

1 に答える 1

3

リンクされた質問のコードは Application.DoEvents を使用します。これは、OnPaint を発生させるための重要な部分です。
それがなければ、Invalidate の代わりに Form.Refresh() を使用できます。

詳細については、この質問を参照してください。

編集:

あなたのコードはいくつかの問題を示していますが、完全ではありません。基本から始めましょう。フォームを動かすために必要なのは、タイマーを有効にすることだけです。

private void timer1_Tick(object sender, EventArgs e)
{            
    this.Location = new Point(this.Location.X + 2, this.Location.Y + 1);
}
于 2009-12-18T17:55:55.640 に答える