2012-10-10 119 views
7

雙緩衝不適用於組合框。 有沒有其他方法可以避免在窗體中閃爍?避免在Windows窗體中閃爍?

我有一個窗體中有一些面板。根據我的菜單選擇,我一次只顯示一個面板。

我有一個圖標面板,一個標題面板和組合框。基於該組合框的選定項目,gridview1和2正在填充。當我使用我的鍵盤向下箭頭快速選擇組合框項目時,圖標面板和標題面板始終在重新繪製。我需要保持這兩者都沒有任何改變。這兩個面板產生一些閃爍的效果(即,他們閃爍或閃爍),而我改變組合框選擇索引。有什麼辦法可以避免這種閃爍。我嘗試在窗體構造函數和表單加載事件中啓用雙緩衝。 請幫助..............

InitializeComponent(); 
       this.SetStyle(ControlStyles.DoubleBuffer, true); 
       this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
       this.SetStyle(ControlStyles.UserPaint, true); 
       this.SetStyle(ControlStyles.SupportsTransparentBackColor, false); 
       this.SetStyle(ControlStyles.Opaque, false); 
       this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
       this.SetStyle(ControlStyles.ResizeRedraw, true); 

我試圖在形式上constuctor和形式的負載情況下,本代碼

+2

歡迎來到SO(stackoverflow)。對不起4評論家的讚譽。 'Windows窗體數量的面板'似乎與'避免窗體閃爍'相關。不要刪除問題。試着改善它呢?共享(代碼)你是如何嘗試雙緩衝區?並將標題編輯爲「避免在窗體中閃爍」。 – Sami

+0

好的。我編輯了這個問題 – ManjuVijayan

+0

這都是不相關的。使用[http:// stackoverflow。COM /問題/ 10362988 /樹狀-閃爍] [1] [1]:http://stackoverflow.com/questions/10362988/treeview-flickering – user1812146

回答

23

又一解決方案:

//TODO: Don't forget to include using System.Runtime.InteropServices. 

internal static class NativeWinAPI 
{ 
    internal static readonly int GWL_EXSTYLE = -20; 
    internal static readonly int WS_EX_COMPOSITED = 0x02000000; 

    [DllImport("user32")] 
    internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

    [DllImport("user32")] 
    internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 
} 

而且你的形式構造看起來應該如下:

public MyForm() 
{ 
    InitializeComponent(); 

    int style = NativeWinAPI.GetWindowLong(this.Handle, NativeWinAPI.GWL_EXSTYLE); 
    style |= NativeWinAPI.WS_EX_COMPOSITED; 
    NativeWinAPI.SetWindowLong(this.Handle, NativeWinAPI.GWL_EXSTYLE, style); 
} 

在上面的代碼中,你可能會將this.Handle更改爲MyFlickeringPanel.Handle

您可以在這裏閱讀更多關於它的信息:Extended Window Styles和這裏:CreateWindowEx

使用WS_EX_COMPOSITED集,窗口的所有後代將使用雙緩衝從底到上的繪畫順序獲得 。自下而上 繪畫順序允許後代窗口具有半透明性(alpha) 和透明度(顏色鍵)效果,但只有當後代 窗口也設置了WS_EX_TRANSPARENT位時。雙緩衝允許 窗口及其後代繪製沒有閃爍。

+0

感謝......非常感謝......這幫了我很多......這是我的第一個問題。 – ManjuVijayan

+0

我沒有更多的信譽來投票答案..這就是爲什麼我不投票...對不起............ – ManjuVijayan

+0

@Khil我有這個問題,並且這工作得很好。我的應用閃爍不佳,所以我嘗試了這個,然後沒有閃爍。然後我注意到,這臺機器上的其他窗口也是這樣做的。起初我沒有注意到這一點,因爲我專注於我的應用程序。我仍然不知道爲什麼這臺機器上的每個窗口都閃爍,但我確實知道我的應用程序是唯一不是的:) – Jake

2

解決方案#1:前
使用ComboxBox.BeginUpdate()你添加項目。這會阻止Control每次將項目添加到列表時重新繪製ComboBox。添加項目後,您可以使用ComboBox.EndUpdate()重新繪製。

解決方案#2

​​
2
protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams handleParam = base.CreateParams; 
      handleParam.ExStyle |= 0x02000000; // WS_EX_COMPOSITED  
      return handleParam; 
     } 
    }