2014-01-20 39 views
2

我有一個winform,我加載了一個包含其他用戶控件的用戶控件。 我每次都進入到諾特爾選項卡,並返回到用戶控制3個控制裏面閃爍甚至befor任何事件觸發。爲什麼我的WinForm控件在繪畫事件之前控制閃爍?

我試過每一件事情,包括:

 this.DoubleBuffered = true; 
     this.SetStyle(ControlStyles.DoubleBuffer, true); 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     this.SetStyle(ControlStyles.UserPaint, true); 
     this.SetStyle(ControlStyles.ResizeRedraw, true); 
     this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 

protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams baseParams = base.CreateParams; 
      baseParams.ExStyle |= 0x0200000; 
      return baseParams; 
     } 
    } 

protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams baseParams = base.CreateParams; 
      baseParams.ExStyle &= 0x0200000; 
      return baseParams; 
     } 
    } 

但沒有什麼幫助...的閃爍情況befor任意代碼運行... 有什麼問題?

+1

是否當您運行在調試模式下項目這只是發生的呢?過去我曾遇到類似的問題,但在發佈模式和/或Visual Studio之外運行時,它們不是問題。另一個不太可能的問題可能是您的顯示適配器驅動程序,我已經看到這是以前的問題,但承認只有一次。 – XN16

+0

給定的信息非常不足以診斷閃爍問題。當你在用戶控件中這樣做時,黑客WS_EX_COMPOSITED無法工作,它必須是在頂級窗口中打開的樣式標誌。表格。 –

+0

我比較調試,但它甚至發生只運行Visual Studio以外的exe文件。 –

回答

2

這可能會發生,因爲背景被繪每次。

如果所有你的畫在OnPaint()完成(包括清除背景 - 這你嵌套的用戶控件可能做自己,所以這個應該沒問題),那麼你就可以完全禁用背景畫如下:

protected override void OnPaintBackground(PaintEventArgs pevent) 
{ 
    // Do nothing to disable background painting. 
} 

你可能會發現,你也需要做,在一個或多個嵌套的用戶控件的實現。

此外,如果您要自定義現有的Windows控制,以防止它閃爍,有時必須做以下(但是這是不是你應該爲你的用戶控件的一個做):

private const int WM_ERASEBKGND = 20; 

[PermissionSet(SecurityAction.Demand, Unrestricted=true)] 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_ERASEBKGND) 
    { 
     m.Result = IntPtr.Zero; 
    } 
    else 
    { 
     base.WndProc(ref m); 
    } 
} 

在定製ListView以防止其閃爍時,我必須這樣做。

+0

你送真的奏效了第二個代碼。謝謝( - : –

1

如果你抽籤在選項卡中的元素,你可以嘗試禁用和恢復「重繪」所描述的here

+1

也''DoubleBufferd = true'可能會有所幫助。 – MoonKnight

相關問題