首页 > 后端开发 > C++ > 如何修复具有圆角和彩色边框的可缩放用户控件中的视觉伪影?

如何修复具有圆角和彩色边框的可缩放用户控件中的视觉伪影?

Barbara Streisand
发布: 2025-01-05 18:05:45
原创
1009 人浏览过

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

如何避免带有圆角的可缩放用户控件的视觉伪像边框

问题:

缩小带有圆角和彩色的用户控件时边框,边框的右侧变得不可见。另外,放大时右侧会出现多个黄色边框。

初始代码片段:

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);
}
登录后复制

解决方案:

至为了解决这些问题,提出以下建议:

  1. 为控件使用区域:定义一个区域来确定要绘制控件的哪一部分。该区域应略小于控件的边界以保留抗锯齿功能。
  2. 应用缩放和平移矩阵:实现缩放矩阵并平移矩阵以缩放并移动区域的边界控制区域的内部。它会根据笔的大小进行缩放和平移。
  3. 设置透明背景:将控件的背景颜色设置为透明,允许周围区域的颜色显示出来。

已更新代码:

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);
    }
}
登录后复制

结果:

更新的代码片段成功防止了由带圆角的可缩放 UserControl 的彩色边框引起的视觉伪影。应用缩放和平移矩阵的修改后的区域可确保所有缩放级别的边框抗锯齿。

以上是如何修复具有圆角和彩色边框的可缩放用户控件中的视觉伪影?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板