2009-04-17 81 views
0

我在使用GDI +时遇到自定义绘制虚线矩形的问题。当扩展Winform窗口时,虚线矩形显示为实心

当窗口大小增加或向上/向下滚动时,虚线矩形的垂直部分显示为实线,实线。快速移动鼠标会导致固体部分越来越少。奇怪的是,水平线不显示这种行为,并按预期显示。

到目前为止,在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); 
       } 
      } 
     } 
    } 
} 

回答

1

我认为有两个问题:似乎存在于其中的矩形没有被正确绘制的窗口的边缘的区域;并且你正在相互绘制矩形,所以莽撞无法正常工作。

用以下替换您的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); 
    } 
+0

感谢,该诀窍马克。这两个问题似乎都成立。只在左边绘制一个矩形而不是在右边时出现实线。此外,任何透支垂直部分也会显示此行为(只有最右边的矩形的右边看起来是正确的)。 由于我的代表太低,无法编辑帖子,有人可以将第一个for循环中的条件修改为'y 2009-04-17 15:51:25