首頁 >後端開發 >C++ >縮放帶有圓角的使用者控制項時如何消除視覺偽影?

縮放帶有圓角的使用者控制項時如何消除視覺偽影?

Barbara Streisand
Barbara Streisand原創
2025-01-05 15:20:45366瀏覽

How to Eliminate Visual Artifacts When Zooming a UserControl with Rounded Corners?

在縮放具有圓角的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 的圓角在視覺上保持一致並且在縮放操作期間沒有偽影。

以上是縮放帶有圓角的使用者控制項時如何消除視覺偽影?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn