2012-10-10 7 views
7

Il buffering doppio non funziona con la casella combinata. esistono altri metodi per evitare lo sfarfallio nei moduli di Windows?Evitare lo sfarfallio in Windows Form?

Ho una finestra con il numero di pannelli al suo interno. Sto mostrando solo un pannello alla volta in base alla mia selezione di menu.

Ho un pannello di icone, un pannello di intestazione e la casella combinata. in base all'elemento selezionato di quella casella combinata, vengono visualizzati il ​​gridview1 e il 2. quando seleziono rapidamente l'elemento della casella combinata utilizzando la mia freccia rivolta verso il basso, il pannello delle icone e il pannello dell'intestazione vengono sempre ridipinti. ho bisogno di mantenerlo entrambi senza alcun cambiamento. questi due pannelli producono un effetto lampeggiante (cioè lampeggiano o lampeggiano) mentre cambio l'indice selezionato della casella combinata. c'è un modo per evitare questo lampeggiante? Ho provato il doppio buffer abilitato nel costruttore di moduli e l'evento di caricamento del modulo. Please Help ..............

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); 

ho provato questo codice in forma constuctor e caricamento form evento

+2

Benvenuti a SO (StackOverflow). Scusa 4 i downvotes dei critici. 'Windows form number of panels 'non sembra rilevante con' evitare lo sfarfallio nei moduli di Windows'. Non eliminare la domanda. Prova a migliorarlo invece? Condividi (codice) come stai cercando di raddoppiare il buffer? e modifica il titolo come "evita lo sfarfallio in forma di finestre". – Sami

+0

Ok. ho modificato la domanda – ManjuVijayan

+0

È tutto irrilevante .. USARE questo controllo personalizzato da [http: // StackOverflow.com/domande/10362988/TreeView-sfarfallio] [1] [1]: http://stackoverflow.com/questions/10362988/treeview-flickering – user1812146

risposta

23

Ancora un'altra soluzione:

//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); 
} 

E il modulo di costruttore dovrebbe apparire come segue:

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); 
} 

Nel codice precedente, si potrebbe cambiare this.Handle in qualcosa come MyFlickeringPanel.Handle

Potete leggere un po 'di più qui: Extended Window Styles e qui: CreateWindowEx.

Con set WS_EX_COMPOSITED, tutti i discendenti di una finestra ottenere ordine pittura dal basso verso l'alto con doppio buffering. In basso l'ordine di pittura consente ad una finestra discendente di avere effetti traslucenza (alpha) e trasparenza (color-key), ma solo se la finestra discendente ha anche il bit WS_EX_TRANSPARENT impostato. Il buffering doppio consente a di dipingere la finestra e i relativi discendenti senza sfarfallio.

+0

Grazie ... grazie mille ... è mi ha aiutato molto .... è la mia prima domanda in SO. – ManjuVijayan

+0

Non ho molta più reputazione per votare la risposta .. è per questo che non sto votando ... Scusa ............ – ManjuVijayan

+0

@Khil Ho avuto questo problema e questo ha funzionato così bene La mia app tremolava male, quindi ho provato questo e non ho avuto problemi di sfarfallio. Quindi quello che ho notato è che anche tutte le altre finestre su questa macchina lo stavano facendo. All'inizio non me ne accorsi perché mi concentrai sulla mia app. Non so ancora perché ogni finestra su questa macchina è tremolante, ma so che la mia app è l'unica che non lo è :) – Jake

2

Soluzione # 1:
Usa ComboxBox.BeginUpdate() prima aggiungi oggetti. Ciò impedirà a Control di ridipingere lo ComboBox ogni volta che un elemento viene aggiunto all'elenco. Dopo aver aggiunto gli articoli, è possibile utilizzare ComboBox.EndUpdate() per ridisegnare.

Soluzione # 2

private void EnableDoubleBuffering() 
{ 
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); 
} 
2
protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams handleParam = base.CreateParams; 
      handleParam.ExStyle |= 0x02000000; // WS_EX_COMPOSITED  
      return handleParam; 
     } 
    }