首頁 >後端開發 >C++ >如何修復具有圓角和彩色邊框的可縮放使用者控制項中的視覺偽影?

如何修復具有圓角和彩色邊框的可縮放使用者控制項中的視覺偽影?

Barbara Streisand
Barbara Streisand原創
2025-01-05 18:05:45980瀏覽

How to Fix Visual Artifacts in a Zoomable UserControl with Rounded Corners and a Colored Border?

如何避免帶有圓角的可縮放使用者控制項的視覺偽像邊框

問題:

縮小帶有圓角和彩色的使用者控制時邊框,邊框的右側變得不可見。另外,放大時右側會出現多個黃色邊框。

初始程式碼片段:

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

解決方案:

至為了為了解決這些問題,提出以下建議:

  1. 為控制項使用區域:定義一個區域來決定要繪製控制項的哪一部分。此區域應略小於控制項的邊界以保留抗鋸齒功能。
  2. 應用縮放和平移矩陣:實現縮放矩陣並平移矩陣以縮放並移動區域的邊界控制區域的內部。它會根據筆的大小進行縮放和平移。
  3. 設定透明背景:將控制項的背景顏色設定為透明,允許周圍區域的顏色顯示出來。

已更新程式碼:

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 的彩色邊框引起的視覺偽影。套用縮放和平移矩陣的修改後的區域可確保所有縮放等級的邊框抗鋸齒。

以上是如何修復具有圓角和彩色邊框的可縮放使用者控制項中的視覺偽影?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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