首頁 >後端開發 >C++ >為什麼縮放使用者控制項上的圓角會出現視覺偽影,如何解決?

為什麼縮放使用者控制項上的圓角會出現視覺偽影,如何解決?

Barbara Streisand
Barbara Streisand原創
2025-01-06 04:34:38621瀏覽

Why Do Rounded Corners on a Zoomed UserControl Exhibit Visual Artifacts, and How Can They Be Resolved?

縮放帶有圓角的UserControl 時出現視覺偽影

問題:

帶有圓角的UserControl角落和彩色邊框在縮放時會出現視覺偽影。縮小時一側邊框不可見,放大時同一側出現多個邊框。

解決方案:

不要直接繪製 Region,而是應用縮放和平移變換以將繪製區域在控制項的區域內稍微向內移動。這可以確保邊框的抗鋸齒像素位於區域內,從而保留抗鋸齒效果。

實作:

  • 設定使用者控制項的BackgroundColor 為 Color.Transparent 以支援色彩透明度。
  • 建立 GraphicsPathWithBorder 和 Region 來定義控制項的形狀。
  • 在 OnPaint 事件中:

    • SmoothingMode 設定為 AntiAlias。
    • 根據筆大小計算縮放和平移值。
    • 使用下列方法應用轉換矩陣。
    • 分別使用畫筆和筆填滿和繪製路徑。
  • 透過更新寬度並重新計算寬度來處理縮放區域。

示例:

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);
    }

    // ...
}

結果:

此方法消除了視覺偽影並提供無縫且具有視覺吸引力的縮放效果。

以上是為什麼縮放使用者控制項上的圓角會出現視覺偽影,如何解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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