新人SEが勉強がてらプログラムとかガジェットとかについてまとめるブログです。

2015年5月25日月曜日

Panelを継承したユーサーコントロールに残像が残る話


躓いてしまったので備忘録代わりに。
標準のパネルでは、窪んだ見た目しか作れなかったので、出っ張ったパネルを作った際に問題が起きました。




問題のコード

残像が残るコードがこちら。
Public Class UserPanel
    Inherits Panel

    Private Sub UserPanel_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
        ControlPaint.DrawBorder3D(e.Graphics, e.ClipRectangle, Border3DStyle.Raised)
    End Sub
End Class

この状態でフォームを画面外に移動させたりするとこの画像のように残像が残ってしまいます。

正しいコード

原因はDrawBorder3Dの二つめの引数ですね。
ここで枠を描画する位置を指定してやるんですが、これがイベントのものになってます。
まだまだ初心者なのでイマイチわかりませんが、多分再描写必要になった位置、つまりウィンドウの移動などによって隠れてしまった位置が渡されているんじゃないかと。
そこで、コードを以下のように変更しました。
Public Class UserPanel
    Inherits Panel

    Private Sub UserPanel_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
        ControlPaint.DrawBorder3D(e.Graphics, Me.DisplayRectangle, Border3DStyle.Raised)
    End Sub
End Class
二つ目の引数をコントロールが持っている位置情報に変えました。
これで、再描写されても配置したコントロールの枠だけが描画されます。
考えてみれば当たり前なんですが、なかなか気づけなかった…



0 件のコメント:

コメントを投稿