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
Libérer: 2025-01-05 18:05:45
original
965 Les gens l'ont consulté

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;
Copier après la connexion

Form1.cs

private void trackBar1_Scroll(object sender, EventArgs e)
{
    UserControl11.SetZoomFactor(trackBar1.Value / 100F);
}
Copier après la connexion

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);
}
Copier après la connexion

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);
    }
}
Copier après la connexion

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!

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