23

数か月間使用しているwinformsのフチなしフォームをドラッグできるコードがあります。これは非常にうまく機能します。

しかし、私が最初にコードを受け取ったとき、それらはフォームthis.Invalidate();のイベントで使用され、MouseMoveフォームは少しちらつき、ドラッグすると遅くなりました。そこで、イベントで交換Invalidate()Update()ましたMouseMoveが、驚いたことに、フォームを非常にスムーズにドラッグできるようになり、ちらつきがまったくなくなりました。

誰かが、Invalidateが使用するのに適切であるように聞こえる場合でも、UpdateによってコードがInvalidateよりもうまく機能する理由を説明できますか?

ありがとう :)

PSコードを追加するともっと役立つかもしれません...今すぐ追加してください。

編集-コードは次のとおりです。


private void titlebar_MouseDown(object sender, MouseEventArgs e)
{
    this.IsMouseDown = true;

    this.LastCursorPosition = new Point(e.X, e.Y);

    if (this.BackColor == Color.White)
    {
        this.BackColor = Color.GhostWhite;
        tbox.BackColor = Color.GhostWhite;
        tbox.ForeColor = Color.Black;
    }
    else
    {
        this.BackColor = Color.FromArgb(20, 20, 20);
        tbox.BackColor = Color.FromArgb(20, 20, 20);
        tbox.ForeColor = Color.White;
    }
}

private void titlebar_MouseMove(object sender, MouseEventArgs e)
{
    if (this.IsMouseDown == true)
    {
        //Move the form
        this.Location = new Point(this.Left - (this.LastCursorPosition.X - e.X), this.Top - (this.LastCursorPosition.Y - e.Y));

        // Update works better than Invalidate();.
        Update();
    }
}

private void titlebar_MouseUp(object sender, MouseEventArgs e)
{
    this.IsMouseDown = false;
    this.BackColor = fc;
    tbox.BackColor = fc;
}
4

2 に答える 2

41

Invalidate()コントロールの更新領域に領域を追加するだけです。次に WM_PAINT を受信すると、無効化した領域とその他の無効化された領域がペイント対象としてマークされます。がRedrawWindow()呼び出されると、通常は WM_PAINT メッセージがアプリケーション キューにポストされます。システムはそれでやりたいこと、通常はより差し迫った仕事を自由に行い、可能な場合はペイントします。

を呼び出すと、再描画する領域をマークしないUpdate()GDI+ が取得されますが、アプリケーション キューをバイパスして に直接プッシュされます。UpdateWindow()WM_PAINTWNDPROC()

コントロールをすぐに更新する必要がある場合は、 を使用しますRefresh()。これにより、領域が無効になり、すぐに が呼び出されますUpdate()

于 2010-02-18T06:27:07.563 に答える
15

Invalidate は、(ある時点で) リフレッシュが必要であることをウィンドウにマークします。更新はそこで行われ、記憶が正しければ

これは、私ができるよりも違いをよりよく説明するためのリンクです

于 2010-02-18T06:06:14.337 に答える