web-dev-qa-db-ja.com

無効化と更新

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

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

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

ありがとう:)

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

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


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;
}
23
anon271334

Invalidateは、ウィンドウを更新する必要があることを示します(ある時点で)。更新はそこでそれを行い、それから私が正しく覚えていれば

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

14
Martin Booth

Invalidate()単純にaddsコントロールの更新領域に領域を追加します。次回WM_Paintを受信すると、無効にした領域とその他の無効にされた領域にペイントのマークが付けられます。 RedrawWindow()が呼び出されると、通常はWM_Paintメッセージがアプリケーションキューに送信されます。システムはそれでやりたいことを自由に行うことができ、通常はより差し迫ったビジネスであり、可能な場合はペイントします。

Update()を呼び出すと、GDI +のUpdateWindow()が取得されます。これは、再描画する領域をマークしませんが、_WM_Paint_を直接WNDPROC()にプッシュします。アプリケーションキュー。

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

40
Justin R.