2012-09-28 55 views
3

我有一個System.Windows.Forms.ListView包含衆多的項目。 這是閃爍無法忍受(似乎往往是這樣),所以經過一番搜索,我決定在「ListViewLessFlicker」類中做這兩件事。模糊文字與C#ListView當減少閃爍

​​

DoubleBuffering並沒有產生太大的影響,即使它在這些主題中的解決方案最常用給出,但設置樣式不透明的巨大降低真實閃爍。
http://www.virtualdub.org/blog/pivot/entry.php?id=273

但是它有一個副作用,我似乎無法找到一個修補程序。 當我將鼠標懸停在ListView中的某個項目上時,它現在會使文本變粗和模糊(除非不透明爲真,否則不會發生這種情況)。

這是一個放大的例子。

enter image description here

如果有人有一個修復或知道爲什麼可以這樣做,我很想知道!

+0

什麼時候閃爍發生?何時添加項目? –

+1

一個建議 - 不是答案 - 更新您的圖形驅動程序。 – tomfanning

+0

閃爍發生刷新列表視圖必須經常做,即在listview1.endUpdate() – James

回答

4

我通常這樣做 - 在調整控件大小時減少閃爍。批量添加項目時,需要使用BeginUpdate()/EndUpdate()以減少閃爍。我不知道是什麼可能導致模糊,所以我不能提供這方面的建議 - 更新視頻驅動程序可能會有幫助,但不要抱太大希望。

[System.ComponentModel.DesignerCategory ("")] 
public partial class ListViewEx : ListView 
{ 
    private const int WM_ERASEBKGND = 0x14; 

    public ListViewEx() 
    { 
     InitializeComponent(); 

     // Turn on double buffering. 
     SetStyle (ControlStyles.OptimizedDoubleBuffer | 
      ControlStyles.AllPaintingInWmPaint, true); 

     // Enable the OnNotifyMessage to filter out Windows messages. 
     SetStyle (ControlStyles.EnableNotifyMessage, true); 
    } 

    protected override void OnNotifyMessage (Message oMsg) 
    { 
     // Filter out the WM_ERASEBKGND message to prevent the control 
     // from erasing the background (and thus avoid flickering.) 
     if (oMsg.Msg != WM_ERASEBKGND) 
      base.OnNotifyMessage (oMsg); 
    } 
} 
+0

這本質上是我的課,除了我的不透明和奇怪我找到了一個與if(oMsg.Msg!= 0x14)等...而不是十進制14. – James

+0

@ user1001328嗯,讓我仔細檢查'WM_ERASEBKGND'值 - 這是真正的代碼複製和粘貼在這裏,所以我相當肯定這應該工作。讓我仔細檢查一下。 – xxbbcc

+1

@ user1001328你說得對,它是'0x14' - 我確定了答案。奇怪,因爲我確定我使用這個代碼來消除閃爍。請注意,閃爍是由控件擦除其背景並在默認灰色上重新繪製白色背景引起的。如果您不過濾掉WM_ERASEBKGND,則設置其他控件樣式實際上沒有效果。 – xxbbcc

3

我有同樣的問題,因爲你,我發現解決方案在本頁面的評論: http://www.virtualdub.org/blog/pivot/entry.php?id=273

您必須創建新類這樣的:

public class BufferedListView : ListView 
{ 
    public BufferedListView() : base() 
    { 
     SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
    } 
} 

然後再定義你的ListView像BufferedListView這樣:

ListView myListView = new BufferedListView(); 

之後,模糊的文本不再是問題;)