Maison >développement back-end >C++ >Comment éliminer les artefacts visuels lors du zoom sur un contrôle utilisateur avec des coins arrondis ?

Comment éliminer les artefacts visuels lors du zoom sur un contrôle utilisateur avec des coins arrondis ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 15:20:45342parcourir

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

Éliminer les artefacts visuels lors du zoom sur un UserControl avec des coins arrondis

Le zoom sur un UserControl avec des coins arrondis peut entraîner des artefacts visuels, tels que la disparition ou frontières déformées. Ce problème survient lorsque la région du contrôle, qui définit sa zone pouvant être peinte, n'est pas mise à jour correctement lors de l'opération de zoom.

Solution :

Pour résoudre ce problème, envisagez d'implémenter l'approche suivante :

Appliquer une échelle et traduire la matrice à la région du contrôle. Cela réduira efficacement les limites de la région, garantissant que lorsque les frontières sont peintes, elles tombent dans la région et sont correctement anti-aliasées.

Définissez la couleur d'arrière-plan du UserControl sur transparent. Cela permet au contenu du contrôle d'être dessiné directement sur le conteneur parent.

Implémentation du contrôle améliorée :

Voici une version améliorée du code UserControl qui intègre la solution ci-dessus :

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

En implémentant ces modifications, vous pouvez vous assurer que les coins arrondis du UserControl restent visuellement cohérents et exempts d'artefacts pendant le zoom. opérations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn