2012-10-10 7 views
7

Podwójne buforowanie nie działa z kombi-box. Czy istnieją inne metody unikania migotania w formularzach systemu Windows?Unikaj migotania w Windows Forms?

Mam jeden formularz okna z liczbą paneli w nim. Wyświetlam tylko jeden panel na raz w oparciu o mój wybór w menu.

Mam jeden panel ikon, jeden panel nagłówka i pole kombi. na podstawie wybranego elementu tego pola kombi wyświetlane są gridview1 i 2. gdy szybko wybieram pozycję w polu kombi przy użyciu strzałki w dół na mojej klawiaturze, panel ikon i panel nagłówka są zawsze odświeżane. Muszę to zachować bez żadnych zmian. te dwa panele wywołujące efekt flashowania (tj. migają lub migają) podczas zmiany indeksu listy kombi. czy istnieje sposób na uniknięcie tego flashowania? próbowałem podwójne buforowanie włączone w formularzu konstruktora i zdarzenia obciążenia formularza. proszę o pomoc ..............

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

Próbowałem ten kod w formie constuctor i obciążenia forma imprezy

+2

Welcome SO (StackOverflow). Przepraszam 4 pochwały krytyków. 'Liczba formularzy w systemie Windows 'nie wydaje się być odpowiednia w przypadku" unikania migotania w formularzach systemu Windows ". Nie usuwaj pytania. Spróbuj zamiast tego poprawić? Udostępnij (kod), jak próbujesz podwoić bufor? i edytuj tytuł jako 'unikaj migotania w postaci okna '. – Sami

+0

Ok. edytowałem pytanie – ManjuVijayan

+0

To wszystko nie ma znaczenia ... UŻYJ tej niestandardowej kontroli z [http: // stackoverflow.com/pytania/10362988/katalogów-migotanie] [1] [1]: http://stackoverflow.com/questions/10362988/treeview-flickering – user1812146

Odpowiedz

23

Jeszcze innym rozwiązaniem:

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

A twój konstruktor forma powinna wyglądać następująco:

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

W kodzie powyżej, może zmień this.Handle na coś takiego jak MyFlickeringPanel.Handle

Możesz przeczytać nieco więcej na ten temat tutaj: Extended Window Styles i tutaj: CreateWindowEx.

Z WS_EX_COMPOSITED zestaw, wszystkie potomkowie okna dostać dołu do góry kolejność malowania za pomocą podwójnego buforowania. Z dołu do góry Kolejność malowania pozwala, aby okno podrzędne miało efekty przezroczystości (alfa) i przezroczystości (klucz koloru), ale tylko wtedy, gdy okno potomne ma również ustawiony bit WS_EX_TRANSPARENT. Podwójne buforowanie pozwala na malowanie okna i jego potomków bez migotania.

+0

Dzięki ... dziękuję ... To bardzo mi pomogło .... to moje pierwsze pytanie w SO. – ManjuVijayan

+0

Nie mam dużo więcej reputacji, aby głosować w górę, dlatego nie jestem w trakcie głosowania ... Przepraszam ............ – ManjuVijayan

+0

@Khil Miałem ten problem i to działało tak dobrze. Moja aplikacja źle się mrugała, więc spróbowałem tego, a potem nie migotałem. Zauważyłem, że robi to także każde inne okno na tym komputerze. Na początku tego nie zauważyłem, ponieważ koncentrowałem się na mojej aplikacji. Wciąż nie wiem, dlaczego każde okno na tej maszynie migocze, ale wiem, że moja aplikacja jest jedyną, która nie jest :) – Jake

2

Rozwiązanie # 1:
Korzystając ComboxBox.BeginUpdate() przed dodajesz przedmioty. Zapobiega to odświeżaniu Control za każdym razem, gdy element zostanie dodany do listy. Po dodaniu elementów można odświeżać je za pomocą ComboBox.EndUpdate().

Rozwiązanie nr 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; 
     } 
    }