掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
フォーム描画をクリアするには (ID:139440)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> Me.Invalidate()の直後に線を描くと > 連続的に使うと、なぜか 描画手順が、少々間違っているかと。 Invalidate は、描画領域を無効化して再描画を促すためのメソッドですが、 呼びだしたからといって、即座に再描画されるというわけではありません。 再描画を行うタイミングは、OS 側で決定されるためです。 マウスポインタの動きを連想してみてください。 マウスをゆっくり動かすと、カーソルは連続した位置に描画されますが、 高速に動かすと、描画が間引かれ、飛び飛びに描画されますよね。 それと同様に、連続して Invalidate を呼び出しても、それらが 1 回の再描画処理に まとめられてしまう事があります。あるいは、フォームが他のウィンドウの影に 隠れている最中は、再描画の必要が無いので描画処理が後回しにされたりもします。 という事で、Invalidate の「直後」に描画を行うべきではありません。 描画すべきタイミングになると、Paint イベント(OnPaint メソッド)が 発生しますので、このタイミングで e.Graphics で描画してみてください。 たとえば: Sub Form1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseMove Invalidate() End Sub Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint e.Graphics.DrawLine(Pens.Red, Point.Empty, PointToClient(MousePosition)) End Sub どうしても Paint イベントを使う事ができないのであれば、即座に再描画するために Refresh や Update を使う事ができますが…その分、再描画のタイミングを自分で 管理する事になるため、個人的にはあまりお薦めしません。 http://dobon.net/vb/dotnet/control/refreshupdateinvalidate.html > 線がちらつきます。 ちらつきを抑えるために、ControlStyles.DoubleBuffer を使用する事もできます。 いずれにしても、描画処理を Paint イベントで行う必要はありますけれども。 http://www.atmarkit.co.jp/fdotnet/dotnettips/197doublebuf/doublebuf.html また、頻繁に描き変わる部分とそうでない部分が混在しているような場合は、 頻繁に描き変わる部分だけは、Paint イベント等の一時描画にて処理し、 描き変わらない部分は、BackgroundImage (あるいは、PictureBox.Image )等に 割り当てられた Bitmap に描画しておく、という手法も使えます。 > Form1のサイズのFillRectangleを 全体を塗りつぶすなら、先述した「Clear メソッド」という手もありますね。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.