>백엔드 개발 >C++ >둥근 모서리와 색상 테두리가 있는 확대/축소 가능한 UserControl에서 시각적 아티팩트를 수정하는 방법은 무엇입니까?

둥근 모서리와 색상 테두리가 있는 확대/축소 가능한 UserControl에서 시각적 아티팩트를 수정하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-05 18:05:45984검색

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

둥근 모서리가 있는 확대/축소 가능 UserControl의 시각적 아티팩트 경계를 피하는 방법

문제:

둥근 모서리와 색상이 있는 사용자 컨트롤을 축소할 때 테두리가 있으면 테두리의 오른쪽이 보이지 않게 됩니다. 또한, 확대 시 오른쪽에 여러 개의 노란색 테두리가 나타납니다.

초기 코드 조각:

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의 색상 테두리로 인해 발생하는 시각적 아티팩트를 성공적으로 방지합니다. 배율 및 변환 매트릭스가 적용된 수정된 영역은 모든 확대/축소 수준에서 앤티앨리어싱 테두리를 보장합니다.

위 내용은 둥근 모서리와 색상 테두리가 있는 확대/축소 가능한 UserControl에서 시각적 아티팩트를 수정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.