角の丸い UserControl をズームするときに視覚的なアーティファクトを除去する
角の丸い UserControl をズームすると、消えたり、歪んだ境界線。この問題は、ペイント可能な領域を定義するコントロールの領域がズーム操作中に適切に更新されない場合に発生します。
解決策:
この問題を解決するには、実装することを検討してください。次のアプローチ:
コントロールの領域にスケールと変換行列を適用します。これにより、領域の境界が効果的に縮小され、境界線がペイントされるときに境界線が領域内に収まり、適切にアンチエイリアス処理されるようになります。
UserControl の背景色を透明に設定します。これにより、コントロールのコンテンツを親コンテナに直接描画できるようになります。
コントロールの実装の改善:
上記のソリューションを組み込んだ UserControl コードの拡張バージョンを次に示します。
using System.Drawing; using System.Drawing.Drawing2D; public class RoundControl : UserControl { private GraphicsPath GraphicsPathWithBorder; private float MyBaseWidth; private float m_PenSize = 2f; private Color m_BorderColor = Color.Yellow; private Color m_FillColor = Color.Green; public RoundControl() { ResizeRedraw = true; InitializeComponent(); MyBaseWidth = Width; BackColor = Color.Transparent; } // ... (other properties and methods) 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); } // ... (other methods) }
これらの変更を実装することで、UserControl の丸い角が視覚的に残るようにすることができます。一貫性があり、ズーム操作中にアーチファクトが発生しません。
以上が角が丸い UserControl をズームするときに視覚的なアーティファクトを除去するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。