簡體   English   中英

C#滾動自定義圖形以減少閃爍的更好方法

[英]C# Better way to scroll custom graphic to reduce flickering

我正在忙於開發C#win窗體應用程序,該應用程序以分層結構繪制數據庫結構的圖形表示。

一切工作正常,我只是滾動問題。 它有一個嚴重的閃爍問題。

我研究了以下內容:

C#圖形閃爍

當您想刷新表面時調用Invalidate() (雖然有很多幫助,但仍然有些滯后)

還要將DoubleBuffered屬性設置為True(問題出在此,我會拋出ArgumentException並顯示消息“參數無效。”。但是我可以在主窗體DoubleBuffered設置為true)。

我設計的細節

我有兩個NodeLink類,它們都具有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM