C# 展开Winform窗口时,虚线矩形显示为实心

C# 展开Winform窗口时,虚线矩形显示为实心,c#,winforms,gdi+,paint,C#,Winforms,Gdi+,Paint,我在自定义绘制虚线矩形时遇到GDI+问题 当窗口大小增大或上下滚动时,虚线矩形的垂直部分显示为实心连续线。更快地移动鼠标会导致实体部分越来越少。奇怪的是,水平线并没有表现出这种行为,而是像预期的那样出现 到目前为止,有两种非最佳解决方案是在OnResize()和OnScroll()期间设置ResizeRedraw=true或调用Invalidate()。我当然想避免这种情况,因为我真正画的东西更复杂,这些缓慢的调用破坏了流体的体验。我还尝试过仅使新显示的区域无效,但没有任何效果-只有完全无效似乎

我在自定义绘制虚线矩形时遇到GDI+问题

当窗口大小增大或上下滚动时,虚线矩形的垂直部分显示为实心连续线。更快地移动鼠标会导致实体部分越来越少。奇怪的是,水平线并没有表现出这种行为,而是像预期的那样出现

到目前为止,有两种非最佳解决方案是在
OnResize()
OnScroll()期间设置
ResizeRedraw=true
或调用
Invalidate()
。我当然想避免这种情况,因为我真正画的东西更复杂,这些缓慢的调用破坏了流体的体验。我还尝试过仅使新显示的区域无效,但没有任何效果-只有完全无效似乎有效

有关于如何解决这个问题的建议吗

演示代码:

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

public class Form1 : Form
{
    static void Main()
    {
        Application.Run(new Form1());
    }

    public Form1()
    {
        this.ClientSize = new System.Drawing.Size(472, 349);

        DoubleBuffered = true;
        //ResizeRedraw = true;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        int dimensions = 70;

        using ( Pen pen = new Pen(Color.Gray) )
        {
            pen.DashStyle = DashStyle.Dash;

            for ( int x = 0; x < 20; ++x )
            {
                for ( int y = 0; y < 20; ++y )
                {
                    Rectangle rect = new Rectangle(x * dimensions, y * dimensions, dimensions, dimensions);

                    e.Graphics.DrawRectangle(pen, rect);
                }
            }
        }
    }
}
使用系统图;
使用System.Drawing.Drawing2D;
使用System.Windows.Forms;
公开课表格1:表格
{
静态void Main()
{
Application.Run(新Form1());
}
公共表格1()
{
this.ClientSize=新系统.Drawing.Size(472349);
双缓冲=真;
//ResizeRedraw=true;
}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
基础漆(e);
内部尺寸=70;
使用(钢笔=新钢笔(颜色为灰色))
{
pen.DashStyle=DashStyle.Dash;
对于(int x=0;x<20;++x)
{
对于(int y=0;y<20;++y)
{
矩形rect=新矩形(x*尺寸,y*尺寸,尺寸,尺寸);
e、 绘图矩形(钢笔、矩形);
}
}
}
}
}

我认为有两个问题:窗口边缘似乎有一个矩形绘制不正确的区域;你画的矩形彼此重叠,所以破折号不能正常工作

将OnPaint循环替换为以下内容:

   for (int y = 0; y < Height; y += dimensions)
   {
       e.Graphics.DrawLine(pen, 0, y, Width, y);
   }
   for (int x = 0; x < Width; x += dimensions)
   {
       e.Graphics.DrawLine(pen, x, 0, x, Height);
   }
for(int y=0;y
谢谢,这就成功了。上述两个问题似乎都成立。仅在左侧边缘绘制单个矩形时,实线会出现,但不会在右侧。此外,任何透光的垂直部分也会显示此行为(只有最右侧矩形的右线看起来是正确的)。由于my rep太低,无法编辑帖子,是否有人可以将第一个for循环中的条件修改为“y