Похоже, это известная ошибка ...
Следующий код работает, как вы просили:
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
.
похоже, что могут помочь следующие обходные пути (хотя и не проверенные):
- Ручка имеет толщину более одного пикселя
- Линия идеально горизонтальная или вертикальная
- Отсечение по границам окна, а не по прямоугольнику клипа
Ниже приведен список статей, которые могут / или могут снова не помочь:
http://www.tech -archive.net / PDF / Архив / Разработка / microsoft.public.win32.programmer.gdi / 2004-08 / 0350.pdf
http://www.tech -archive.net / Архив / Разработка / microsoft.public.win32.programmer.gdi / 2004-08 / 0368.html
OR ...
возможно также следующее:
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 canvas / Control. Поскольку область отличается от прямоугольника, результаты должны соответствовать ожидаемым. Этот код может быть доказан для работы, добавив
e.Graphics.FillRectangle( new SolidBrush( Color.Black ), b );
после вызова setClip (). Это ясно показывает, что черный прямоугольник появляется только в обрезанной области.
Это может быть допустимым обходным решением, если сглаживание линии не является вариантом.
Надеюсь, это поможет