2009-04-17 7 views
0

カスタムペイントの破線の四角形が表示されているときにGDI +に関する問題が発生しています。破線の四角形は、Winformウィンドウを展開すると固まって表示されます。

破線の四角形の垂直部分は、ウィンドウサイズを大きくしたりスクロールアップしたりしたときに実線、連続線として表示されます。マウスを速く動かすと、ソリッドセクションが少なくなります。不思議なことに、水平線はこの動作を示さず、期待どおりに表示されます。

これまでは、ResizeRedraw = trueを設定するか、OnResize()OnScroll()の間にInvalidate()を呼び出すという2つの最適でない解決策がありました。私が実際に描いているものがより複雑で、これらの遅い呼び出しが流体の経験を破壊するので、私はもちろんこれを避けたいと思います。私はまた、新たに表示された領域だけを無効にしようとしました。完全無効化が機能するようです。

どのようにこれを行うにはポインタ?

デモコード:私は二つの問題があると思い

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

おかげで、。言及された2つの問題は真実であるようです。実線は、左端に1つの矩形を描くだけで、右端には描かれない場合に表示されます。また、上書きされた縦のセクションにもこの動作が表示されます(右端の矩形の右のラインのみが正しいように見えます)。 投稿者が投稿を編集するには低すぎるので、最初のforループの条件を 'y <幅'ではなく 'y <高さ'に変更できますか? –

関連する問題