Rumah >pembangunan bahagian belakang >C++ >Mengapa Sudut Bulat pada UserControl yang Dizum Mempamerkan Artifak Visual, dan Bagaimana Ia Boleh Diselesaikan?

Mengapa Sudut Bulat pada UserControl yang Dizum Mempamerkan Artifak Visual, dan Bagaimana Ia Boleh Diselesaikan?

Barbara Streisand
Barbara Streisandasal
2025-01-06 04:34:38640semak imbas

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

Artifak Visual Semasa Mengezum Kawalan Pengguna dengan Sudut Bulat

Masalah:

Kawalan Pengguna dengan bulat sudut dan sempadan berwarna mempamerkan artifak visual apabila dizum. Sempadan menjadi tidak kelihatan pada satu sisi semasa mengezum keluar dan berbilang sempadan muncul pada sebelah yang sama apabila mengezum masuk.

Penyelesaian:

Daripada mengecat Wilayah secara langsung, gunakan Skala dan Terjemah transformasi untuk memindahkan kawasan yang dicat ke dalam sedikit dalam Wilayah kawalan. Ini memastikan bahawa piksel anti-alias sempadan berada dalam Wilayah, mengekalkan kesan anti-aliasing.

Pelaksanaan:

  • Tetapkan Kawalan Pengguna BackgroundColor to Color.Transparent untuk menyokong ketelusan warna.
  • Buat GraphicsPathWithBorder dan Rantau untuk menentukan bentuk kawalan.
  • Dalam acara OnPaint:

    • Tetapkan SmoothingMode kepada AntiAlias.
    • Kira skala dan terjemah nilai berdasarkan Saiz pen.
    • Gunakan transformasi menggunakan a Matriks.
    • Isi dan lukis laluan masing-masing menggunakan Berus dan Pen.
  • Kendalikan zum dengan mengemas kini Lebar dan mengira semula Wilayah.

Contoh:

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

    // ...
}

Hasil:

Pendekatan ini menghapuskan artifak visual dan menyediakan kesan zum yang lancar dan menarik secara visual.

Atas ialah kandungan terperinci Mengapa Sudut Bulat pada UserControl yang Dizum Mempamerkan Artifak Visual, dan Bagaimana Ia Boleh Diselesaikan?. 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