> 백엔드 개발 > C++ > 둥근 모서리가 있는 UserControl을 확대/축소할 때 시각적 아티팩트를 제거하는 방법은 무엇입니까?

둥근 모서리가 있는 UserControl을 확대/축소할 때 시각적 아티팩트를 제거하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-05 15:20:45
원래의
323명이 탐색했습니다.

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의 둥근 모서리가 시각적으로 유지되도록 할 수 있습니다. 확대/축소 작업 중에 일관되고 아티팩트가 없습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿