Maison >développement back-end >C++ >Comment réparer des artefacts visuels dans un contrôle utilisateur zoomable avec des coins arrondis et une bordure colorée ?

Comment réparer des artefacts visuels dans un contrôle utilisateur zoomable avec des coins arrondis et une bordure colorée ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 18:05:451025parcourir

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

Comment éviter la bordure d'artefacts visuels d'un contrôle utilisateur zoomable avec des coins arrondis

Problème :

Lors d'un zoom arrière sur un contrôle utilisateur avec des coins arrondis et une couleur bordure, le côté droit de la bordure devient invisible. De plus, plusieurs bordures jaunes apparaissent sur le côté droit lors d'un zoom avant.

Code initial Extraits :

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

Solution :

À Pour résoudre les artefacts, les recommandations suivantes sont faites :

  1. Utiliser une région pour le contrôle : Définissez une région qui déterminera quelle partie du contrôle peindre. Cette région doit être légèrement plus petite que les limites du contrôle pour préserver l'anticrénelage.
  2. Appliquer une matrice d'échelle et de translation : Implémenter une matrice d'échelle et traduire la matrice pour mettre à l'échelle et déplacer les limites de la région. l'intérieur de la région de contrôle. Il évolue et se traduit en fonction de la taille du stylo.
  3. Définissez un arrière-plan transparent : Définissez la couleur d'arrière-plan du contrôle sur Transparent, permettant à la couleur de la zone environnante de transparaître.

Code mis à jour :

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

Résultats :

Le code mis à jour L'extrait de code empêche avec succès les artefacts visuels causés par la bordure colorée du UserControl zoomable avec des coins arrondis. La région modifiée avec échelle appliquée et matrice de translation garantit des bordures anti-aliasées à tous les niveaux de zoom.

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