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