共通の親コントロールの同じ ControlCollection に属する、より高い z オーダーを持つ他のコントロールによって引き起こされるコントロールの非表示領域の描画を強制しようとしています。2 つのオーバーラップするコントロールの場合、2 つのコントロールのうち高い方をペイントするときに、交差する描画操作に備えて独自のグラフィックスを渡しながら、下位のコントロールで独自の InvokePaint メソッドと InvokePaintBackground メソッドを呼び出すという考え方です。
要求された質問の明確化:より一般的には、2 番目のコントロールが最初のコントロールとどのようにオーバーラップするかに基づいて、あるコントロールのサブセットを別のコントロールのグラフィックス サーフェスに描画しようとしています。
関心のある領域を描画する変換とクリッピング領域の順列を見つけることができないようです。問題は、元のサイズを内部的に参照しているように見えるか、可視性を確立するためにアクセスできない呼び出しを行っているように見える VisibleClippingBounds にあると思われ、基になる領域を宣言しますしたがって、hidden を描画する必要はなく、VisibleClipBounds をエッジの長さがゼロの長方形に折りたたみます。
これは正しく動作するはずのコードですが、動作しません:
Dim translation As Point = Control.RelationTo(Me)
Dim intersectionClip As New Region(Control.RelativeClientRectangle(Me))
intersectionClip.Intersect(siblingClip)
pevent.Graphics.Transform = New Drawing2D.Matrix(1, 0, 0, 1, translation.X, translation.Y)
pevent.Graphics.Clip = intersectionClip
InvokePaintBackground(Control, pevent)
InvokePaint(Control, pevent) 'controlPaintEventArgs)
法則:
1) このコントロール (Me) に対する下位コントロール (Control) の相対位置を確立します。この点は、このコントロールの (0, 0) で始まり、下のコントロールの (0, 0) で終わるベクトルを表し、相対位置を示します。
Dim translation As Point = Control.RelationTo(Me)
2) このコントロールの座標系における下部コントロールの長方形の領域から開始します。返される四角形は、RelationTo 呼び出しから返されたポイントにあり、下部コントロールのサイズです。
Dim intersectionClip As New Region(Control.RelativeClientRectangle(Me))
3) このコントロールの座標で、このコントロールの関連する描画領域を見つけるために、下にあるコントロールの既知の領域の合計の事前に確立された領域と領域を交差させます。
intersectionClip.Intersect(siblingClip)
4) 相対制御オフセットの方向に平行移動変換をグラフィックス オブジェクトに適用します。
pevent.Graphics.Transform = New Drawing2D.Matrix(1, 0, 0, 1, translation.X, translation.Y)
5) 以前に確立したクリップ領域を適用します。重要なのは、変換を設定した後で、変換が変更されたときに変更されないようにすることです。
pevent.Graphics.Clip = intersectionClip
6) このコントロールの PaintEventArgs オブジェクトを使用して、下側のコントロールでペイント イベントを発生させます。ここで保持されている Graphics は描画用に準備されています。
InvokePaintBackground(Control, pevent)
InvokePaint(Control, pevent) 'controlPaintEventArgs)
結果は、VisibleClipBounds がゼロ領域に折りたたまれていることを示唆する、何もペイントされていない黒いボイドです。