数か月間使用している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;
}
Invalidateは、ウィンドウを更新する必要があることを示します(ある時点で)。更新はそこでそれを行い、それから私が正しく覚えていれば
ここに リンク 私ができるよりも違いをよりよく説明するために
Invalidate()
単純にaddsコントロールの更新領域に領域を追加します。次回WM_Paintを受信すると、無効にした領域とその他の無効にされた領域にペイントのマークが付けられます。 RedrawWindow()
が呼び出されると、通常はWM_Paintメッセージがアプリケーションキューに送信されます。システムはそれでやりたいことを自由に行うことができ、通常はより差し迫ったビジネスであり、可能な場合はペイントします。
Update()
を呼び出すと、GDI +のUpdateWindow()
が取得されます。これは、再描画する領域をマークしませんが、_WM_Paint
_を直接WNDPROC()
にプッシュします。アプリケーションキュー。
needコントロールをすぐに更新する場合は、Refresh()
を使用します。これにより、領域が無効になり、すぐにUpdate()
が呼び出されます。