Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menghapuskan Artifak Visual Apabila Mengezum Kawalan Pengguna dengan Sudut Bulat?

Bagaimana untuk Menghapuskan Artifak Visual Apabila Mengezum Kawalan Pengguna dengan Sudut Bulat?

Barbara Streisand
Barbara Streisandasal
2025-01-05 15:20:45382semak imbas

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

Menghapuskan artifak visual apabila mengezum UserControl dengan sudut bulat

Mengezum UserControl dengan sudut bulat boleh mengakibatkan artifak visual, seperti hilang atau sempadan yang diputarbelitkan. Isu ini timbul apabila Wilayah kawalan, yang mentakrifkan kawasan boleh lukisnya, tidak dikemas kini dengan betul semasa operasi zum.

Penyelesaian:

Untuk menyelesaikan isu ini, pertimbangkan untuk melaksanakan pendekatan berikut:

Gunakan skala dan terjemahkan matriks ke Wilayah kawalan. Ini akan mengecilkan sempadan rantau ini dengan berkesan, memastikan bahawa apabila sempadan dicat, ia termasuk dalam Wilayah dan anti-alias dengan betul.

Tetapkan warna latar belakang UserControl kepada telus. Ini membolehkan kandungan kawalan dilukis terus ke bekas induk.

Pelaksanaan Kawalan Yang Dipertingkat:

Berikut ialah versi dipertingkatkan kod UserControl yang menggabungkan penyelesaian di atas:

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

Dengan melaksanakan perubahan ini, anda boleh memastikan bahawa UserControl sudut bulat kekal konsisten secara visual dan bebas daripada artifak semasa operasi zum.

Atas ialah kandungan terperinci Bagaimana untuk Menghapuskan Artifak Visual Apabila Mengezum Kawalan Pengguna dengan Sudut Bulat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn