これは既知のバグのようです...
次のコードは、要求どおりに機能しているように見えます。
protected override void OnPaint(PaintEventArgs e)
{
PointF[] points = new PointF[] { new PointF(73.36f, 196),
new PointF(75.44f, 32),
new PointF(77.52f, 32),
new PointF(79.6f, 196),
new PointF(85.84f, 196) };
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
Rectangle b = new Rectangle(70, 32, 20, 165);
e.Graphics.SetClip(b);
e.Graphics.DrawLines(Pens.Red, points); // clipped incorrectly
e.Graphics.TranslateTransform(80, 0);
e.Graphics.ResetClip();
e.Graphics.DrawLines(Pens.Red, points);
}
注:ラインをアンチエイリアス処理し、クリッピング領域を1つ拡張しました
次の回避策が役立つ可能性があります(テストされていませんが)。
- ペンの太さは1ピクセルを超えています
- 線は完全に水平または垂直です
- クリッピングは、クリップの長方形ではなく、ウィンドウの境界に対して行われます。
以下は、役に立たない可能性のある/または役に立たない可能性のある記事のリストです。
http://www.tech-archive.net/pdf/Archive/Development/microsoft.public.win32.programmer.gdi/2004-08/0350.pdf
http://www.tech-archive.net/Archive/Development /microsoft.public.win32.programmer.gdi/2004-08/0368.html
また...
次のことも可能です。
protected override void OnPaint ( PaintEventArgs e )
{
PointF[] points = new PointF[] { new PointF(73.36f, 196),
new PointF(75.44f, 32),
new PointF(77.52f, 32),
new PointF(79.6f, 196),
new PointF(85.84f, 196) };
Rectangle b = new Rectangle( 70, 32, 20, 164 );
Region reg = new Region( b );
e.Graphics.SetClip( reg, System.Drawing.Drawing2D.CombineMode.Union);
e.Graphics.DrawLines( Pens.Red, points ); // clipped incorrectly
e.Graphics.TranslateTransform( 80, 0 );
e.Graphics.ResetClip();
e.Graphics.DrawLines( Pens.Red, points );
}
これは、キャンバス/コントロールのClientRectangleと結合/結合された領域(私は思う)を使用して効果的にクリップします。領域は長方形から区別されるため、結果は期待どおりになるはずです。このコードは、追加することで機能することが証明できます
e.Graphics.FillRectangle( new SolidBrush( Color.Black ), b );
setClip()呼び出しの後。これは、クリップされた領域にのみ表示される黒い長方形を明確に示しています。
回線のアンチエイリアシングがオプションでない場合、これは有効な回避策になる可能性があります。
お役に立てれば