角が丸く色付きのユーザー コントロールをズームアウトする場合境界線を指定すると、境界線の右側が非表示になります。また、拡大すると右側に複数の黄色の枠線が表示されます。
Form1.Designer.cs
trackBar1.Value = 100; BackColor = Color.Gray;
Form1.cs
private void trackBar1_Scroll(object sender, EventArgs e) { UserControl11.SetZoomFactor(trackBar1.Value / 100F); }
UserControl1.cs
// Properties, constructors, and event handlers omitted for brevity internal GraphicsPath GraphicsPathWithBorder; internal void SetZoomFactor(float z) { Width = (int)(MyBaseWidth * z); GraphicsPathWithBorder = RoundedCornerRectangle(ClientRectangle); Region = new Region(GraphicsPathWithBorder); }
アーティファクトに対処するには、次の推奨事項が行われます:
public partial class RoundControl : UserControl { // Properties, constructors, and event handlers omitted for brevity 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 の色付き境界線によって引き起こされる視覚的なアーティファクトを正常に防止します。適用されたスケールと変換マトリックスを使用して変更されたリージョンにより、すべてのズーム レベルで境界線のアンチエイリアスが保証されます。
以上が角が丸く色付きの境界線を持つズーム可能な UserControl の視覚的なアーティファクトを修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。