2011-10-07 29 views
1

我已經看過網絡有關這個,但還沒有找到確切的答案,我正在尋找或我已經嘗試過什麼建議,它不'工作!C#Winforms使用Drawline方法超慢屏幕更新

我遇到了一個問題,我有一個屏幕,其中有大約72個複選框,它用矩陣表示,我用列表中存儲的座標系連接在一起。

要畫我使用的DrawLine方法的覆蓋方法的線的OnPaint來遍歷列表如下: -

protected override void OnPaint(PaintEventArgs e) 
    { 
     Pen myPen = new Pen(System.Drawing.Color.Black); 
     Graphics g = this.CreateGraphics(); 
     myPen.Width = 5; 

     foreach(ConnectionLine cl in connectionLines) 
     { 
     g.DrawLine(myPen, cl.xStart, cl.yStart, cl.xStop, cl.yStop); 
     } 

     myPen.Dispose(); 
     g.Dispose(); 

    } 

關於這個奇怪的是,它似乎並沒有成爲需要花時間繪製的線條 - 現在是複選框,如果我刪除了在瞬間刷新的線條功能。

任何想法非常讚賞。

感謝,

戴夫

回答

3

部分問題可能是你現在重新創建每個控制描繪時Graphics對象。相反,您應該使用PaintEventArgs中提供的e.Graphics對象。您也可以嘗試只使用Pen的一個實例。

private readonly Pen _myPen = new Pen(System.Drawing.Color.Black) {Width = 5}; 
protected override void OnPaint(PaintEventArgs e) 
{ 
    foreach (var cl in connectionLines) 
     e.Graphics.DrawLine(_myPen, cl.xStart, cl.yStart, cl.xStop, cl.yStop); 
} 
+0

我會給它一個去 - 謝謝你的答案。 – davidpcl1977

+0

這樣做的工作! Thankyou - 你讓我的週末減輕壓力! – davidpcl1977

+0

很酷,沒問題。看看我剛剛做的編輯。您也可以通過重複使用Pen對象來擠壓一些額外的性能。不要忘記將其標記爲接受的答案。 –

1

有沒有必要創建自己的和處置一個圖形對象。使用事件處理程序可用的內容。您應該使用using而不是顯式調用Dispose。

protected override void OnPaint(PaintEventArgs e) 
    { 
     using (Pen myPen = new Pen(System.Drawing.Color.Black, 5.0)) 
     { 
      foreach(ConnectionLine cl in connectionLines) 
        e.Graphics.DrawLine(myPen, cl.xStart, cl.yStart, cl.xStop, cl.yStop); 
     } 
    } 

另外,如果你的連接線,你應該得到更好的性能和更乾淨的代碼與圖形的DrawLines方法。在調用之前,您必須更改存儲點的方式或從conncetionLines集合中提取它們。

+0

謝謝你的回答 - 我會向你提供關於連接線路和船上使用部件的建議。 – davidpcl1977