Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Membetulkan Artifak Visual dalam Kawalan Pengguna Boleh Zum dengan Sudut Bulat dan Sempadan Berwarna?

Bagaimana untuk Membetulkan Artifak Visual dalam Kawalan Pengguna Boleh Zum dengan Sudut Bulat dan Sempadan Berwarna?

Barbara Streisand
Barbara Streisandasal
2025-01-05 18:05:451014semak imbas

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

Cara Mengelakkan Sempadan Artifak Visual Kawalan Pengguna Boleh Zum dengan Sudut Bulat

Masalah:

Apabila mengezum keluar kawalan pengguna dengan bucu bulat dan berwarna sempadan, sebelah kanan sempadan menjadi tidak kelihatan. Selain itu, berbilang sempadan kuning muncul di sebelah kanan apabila mengezum masuk.

Kod Awal Coretan:

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

Penyelesaian:

Kepada menangani artifak, pengesyoran berikut dibuat:

  1. Gunakan Wilayah untuk Kawalan: Tentukan Wilayah yang akan menentukan bahagian Kawalan yang hendak dilukis. Wilayah ini sepatutnya lebih kecil sedikit daripada sempadan Kawalan untuk mengekalkan anti-aliasing.
  2. Gunakan Skala dan Terjemah Matriks: Laksanakan matriks skala dan menterjemah matriks untuk menskalakan dan menggerakkan sempadan Wilayah pada bahagian dalam Wilayah Kawalan. Ia menskala dan menterjemah mengikut saiz Pen.
  3. Tetapkan Latar Belakang Lutsinar: Tetapkan warna latar belakang Kawalan kepada Lutsinar, membenarkan warna kawasan sekeliling kelihatan melalui.

Dikemas kini Kod:

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

Keputusan:

Coretan kod yang dikemas kini berjaya menghalang artifak visual yang disebabkan oleh jidar berwarna UserControl boleh zum dengan sudut bulat. Rantau yang diubah suai dengan skala terpakai dan matriks terjemah memastikan sempadan anti-alias pada semua peringkat zum.

Atas ialah kandungan terperinci Bagaimana untuk Membetulkan Artifak Visual dalam Kawalan Pengguna Boleh Zum dengan Sudut Bulat dan Sempadan Berwarna?. 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