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
Lepaskan: 2025-01-05 18:05:45
asal
977 orang telah melayarinya

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;
Salin selepas log masuk

Form1.cs

private void trackBar1_Scroll(object sender, EventArgs e)
{
    UserControl11.SetZoomFactor(trackBar1.Value / 100F);
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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);
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan