角が丸い UserControl をズームすると視覚的にアーティファクトが発生する
問題:
角が丸い UserControlズームすると、角と色付きの境界線に視覚的なアーティファクトが表示されます。ズームアウトすると片側の境界線が非表示になり、ズームインすると同じ側に複数の境界線が表示されます。
解決策:
領域を直接ペイントする代わりに、スケール変換と移動変換を使用して、ペイントされた領域をコントロールの領域内でわずかに内側に移動します。これにより、境界線のアンチエイリアス処理されたピクセルがリージョン内に収まり、アンチエイリアス効果が維持されます。
実装:
OnPaint イベント内:
例:
using System.Drawing; using System.Drawing.Drawing2D; public class RoundControl : UserControl { // ... protected override void OnPaint(PaintEventArgs e) { e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; RectangleF rect = GraphicsPathWithBorder.GetBounds(); float scaleX = 1 - ((m_PenSize + 1) / rect.Width); float scaleY = 1 - ((m_PenSize + 1) / rect.Height); using (Pen pen = new Pen(m_BorderColor, m_PenSize)) using (Brush brush = new SolidBrush(m_FillColor)) using (Matrix mx = new Matrix(scaleX, 0, 0, scaleY, pen.Width / 2, pen.Width / 2)) { e.Graphics.Transform = mx; e.Graphics.FillPath(brush, GraphicsPathWithBorder); e.Graphics.DrawPath(pen, GraphicsPathWithBorder); } base.OnPaint(e); } // ... }
結果:
このアプローチでは、視覚的なアーチファクトが排除され、シームレスで視覚的に魅力的なズーム効果。
以上がズームされた UserControl の丸い角に視覚的なアーティファクトが表示されるのはなぜですか?また、それらはどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。