[英]How to avoid flickering of graphic object when drawn on picture box in C#?
[英]C# Better way to scroll custom graphic to reduce flickering
我正在忙於開發C#win窗體應用程序,該應用程序以分層結構繪制數據庫結構的圖形表示。
一切工作正常,我只是滾動問題。 它有一個嚴重的閃爍問題。
我研究了以下內容:
當您想刷新表面時調用Invalidate()
(雖然有很多幫助,但仍然有些滯后)
還要將DoubleBuffered
屬性設置為True(問題出在此,我會拋出ArgumentException
並顯示消息“參數無效。”。但是我可以在主窗體DoubleBuffered
設置為true)。
我設計的細節
我有兩個Node
和Link
類,它們都具有GraphicsPath
成員,並且它們都有一個public void Draw(Graphics g)
方法來繪制自己。
我還有一個用戶控件調用StructureMap
,它已重寫protected override void OnPaint(PaintEventArgs e)
方法,以遍歷調用它的draw函數的每個Node
。 循環很簡單,因為父節點通過Link
對象鏈接到子節點。 我要做的就是調用父節點的draw方法,並且其所有子節點也都被重繪。
我也以同樣的方式執行Hit測試。
有沒有更好的辦法? 為什么不能在用戶控件DoubleBuffered
設置為true?
PS:這是我的第一篇文章,請問我是怎么做到的?
DoubleBuffered ArgumentException可能是由於您在某處放置圖形對象而引起的。
另請參閱本文; 是什么原因導致Double Buffering終止我的應用程序?
像這樣閃爍的聲音是由繪制圖像所需的處理量引起的。
緩解這種情況的一種方法是將模型繪制到屏幕外的位圖,然后繪畫/滾動等將位圖繪制到屏幕上。
然后,僅在模型更改時更新位圖。
使用位圖作為背景圖像將減少閃爍。 也許像這樣:
private Bitmap _backBuffer;
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (_backBuffer == null)
{
_backBuffer = new Bitmap(Form1.Width, Form1.Height, PixelFormat.Format32bppRgb);
}
Graphics g = Graphics.FromImage(_backBuffer);
g.SmoothingMode = SmoothingMode.HighQuality;
drawSomething(g);
//Copy the back buffer to the screen
e.Graphics.DrawImageUnscaled(_backBuffer, 0, 0);
Form1.BackgroundImage = _backBuffer;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.