2012-11-16 38 views
3

我有一個窗體上的一個簡單的面板,我使用AutoScrollMinSize和AutoScroll來獲取我面板上的一些滾動條,一切正常。在滾動事件和繪畫事件之間的延遲,也許之間的東西

我也有一個滾動事件,我用它來使整個面板區域失效,事實上它似乎只是無效滾動左/右,上/下滾動時需要的位。除此之外,我使用與面板大小相同的BufferedGraphics,然後做一個.Render(e.Graphics),因爲我想讓它在整個面板上繪製,就好像滾動條不存在一樣。

現在,我遇到的問題是,在滾動和正在繪製內容時,似乎存在視覺上的滯後滯後,我認爲這是因爲有一個額外的繪圖/設置階段,我不熟悉之前Scroll事件被調用,或者在它和Paint事件之間被調用。

如果我在paint方法內部有一個invalidate面板,您看不到問題,但這更多的是在多次隱藏問題時調用paint事件。

所以我認爲我理解它的方式是,當您滾動時,引擎蓋下的某個東西會執行一個大的矩形移動已經存在的內容,然後使用需要填充的區域的矩形調用invalidate。

如果是這樣的話,反正有沒有這個,就像在禁止這個階段或其他一些設置時我錯過了擺脫繼續滯後?

PS:我也重寫了OnPaintBackground方法,它是一個空的存根。

+0

紡紗自己的雙緩衝方案,堅持繪製整個面板,無論滾動位置是非常好的方式,使繪畫緩慢。不要。 –

回答

2

好的,回答我自己的問題,以防萬一在罕見的情況下幫助任何人需要這個。從提到LockWindowUpdate的人開始,我開始使用WM_SETREDRAW,並且這篇文章爲SuspendDrawing,現在我可以順利滾動並繪製完整面板。通過只有一個滾動事件進行以下操作。因人而異。

[DllImport("user32.dll")] 
    private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); 
    private const int WM_SETREDRAW = 0xB; 

    private void PanelView_Scroll(object sender, ScrollEventArgs e) 
    { 
     Control control = sender as Control; 
     if (control!=null) 
     { 
      if (e.Type == ScrollEventType.ThumbTrack) 
      { 
       // Enable drawing 
       SendMessage(control.Handle, WM_SETREDRAW, 1, 0); 
       // Refresh the control 
       control.Refresh(); 
       // Disable drawing        
       SendMessage(control.Handle, WM_SETREDRAW, 0, 0); 
      } 
      else 
      { 
       // Enable drawing 
       SendMessage(control.Handle, WM_SETREDRAW, 1, 0); 
       control.Invalidate(); 
      } 
     } 
    } 
+0

爲什麼選擇投票?我會很感激一個改進的答案。 – Niksan

相關問題