Maison > développement back-end > C++ > Pourquoi les coins arrondis d'un contrôle utilisateur zoomé présentent-ils des artefacts visuels et comment peuvent-ils être résolus ?

Pourquoi les coins arrondis d'un contrôle utilisateur zoomé présentent-ils des artefacts visuels et comment peuvent-ils être résolus ?

Barbara Streisand
Libérer: 2025-01-06 04:34:38
original
605 Les gens l'ont consulté

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

Artefacts visuels lors du zoom d'un contrôle utilisateur avec des coins arrondis

Problème :

Un contrôle utilisateur avec des coins arrondis les coins et une bordure colorée présentent des artefacts visuels lors du zoom. La bordure devient invisible d'un côté lors d'un zoom arrière et plusieurs bordures apparaissent du même côté lors d'un zoom avant.

Solution :

Au lieu de peindre directement la région, appliquez Transformations Redimensionner et Traduire pour déplacer légèrement la zone peinte vers l'intérieur de la région du contrôle. Cela garantit que les pixels anti-aliasés de la bordure se trouvent dans la région, préservant ainsi l'effet d'anti-aliasing.

Mise en œuvre :

  • Définissez les paramètres du contrôle utilisateur. BackgroundColor à Color.Transparent pour prendre en charge la transparence des couleurs.
  • Créez GraphicsPathWithBorder et Region pour définir le contrôle. shape.
  • Dans l'événement OnPaint :

    • Définissez le SmoothingMode sur AntiAlias.
    • Calculez l'échelle et traduisez les valeurs en fonction de la taille du stylo.
    • Appliquer les transformations à l'aide d'une matrice.
    • Remplissez et dessinez le chemin à l'aide d'un pinceau et Stylo, respectivement.
  • Gérez le zoom en mettant à jour la largeur et en recalculant la région.

Exemple :

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

    // ...
}
Copier après la connexion

Résultat :

Cette approche élimine le visuel artefacts et fournit un effet de zoom transparent et visuellement attrayant.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal