Mam kilka niestandardowych (winformy) składników, które rysują na ekranie przy użyciu GDI +.Co może spowodować, że Double Buffering zabije moją aplikację?
Aby zapobiec migotaniu na repaint, postanowiłem włączyć podwójne buforowanie, więc dodałem linię do mojego konstruktora:
public ColourWheel()
{
InitializeComponent();
this.DoubleBuffered = true;
}
Które działa dobrze na tym składniku (ColourWheel). Kiedy dodać taką samą linię do konstruktora jednej z moich dwóch innych (podobnie strukturyzowanych) komponentów, mam kilka dziwnych objawów:
- gdy próbuję uruchomić formularz ze składnikiem sprawie, otrzymuję Wyjątek argumentu na
Application.Run(new Form());
. - Po przejściu do trybu projektowania pojawia się błąd dotyczący składnika mającego nieobsługiwany wyjątek związany z parametrem.
Nie ma znaczenia, czy zmieniam podwójne buforowanie na jednym czy z każdym, nadal działa na ColourWheel, ale nie na innych.
Dla przypomnienia, wypróbowałem także kilka innych technik doublebuffering.
Co może powodować podwójne buforowanie do pracy na jednym komponencie, ale inne nie?
EDIT: Oto szczegóły wyjątek od objawu run-time:
System.ArgumentException był nieobsługiwany Message = Parametr nie jest ważny. Źródło = System.Drawing StackTrace: w System.Drawing.Graphics.GetHdc() w System.Drawing.BufferedGraphics.RenderInternal (HandleRef refTargetDC bufor BufferedGraphics) w System.Drawing.BufferedGraphics.Render() w System.Windows .Forms.Control.WmPaint (Message & m) w System.Windows.Forms.Control.WndProc (Message & m) w System.Windows.Forms.ScrollableControl.WndProc (Message & m) w System.Windows.Forms .UserControl.WndProc (Message & m) w System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Wiadomość & m) w System.Windows.Forms.Co ntrol.ControlNativeWindow.WndProc (Message & m) w System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 MSG IntPtr wParam, IntPtr LPARAM) w System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG & MSG) w System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (IntPtr dwComponentID, Int32 powodu Int32 pvLoopData) w System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (Int32 powód, kontekst ApplicationContext) w System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Int32 powód, kontekst ApplicationContext) w S ystem.Windows.Forms.Application.Run (Form mainForm) w TestForm.Program.Główny() w D: \ Documents and Settings \ Tom Wright \ Moje dokumenty \ Visual Studio 2010 \ Projects \ ColourPicker \ TestForm \ Program.cs: wiersz 18 w System.AppDomain._nExecuteAssembly (zestaw RuntimeAssembly, String [] args) w System.AppDomain.ExecuteAssembly (string assemblyFile, Evidence assemblySecurity, String [] args) w Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() w System.Threading.ThreadHelper.ThreadStart_Context (stan obiektu) w System.Threading .ExecutionContext.Run (ExecutionContext executionContext, ContextCallback callback, Stan obiektu, Boolean ignoreSyncCtx) w System.Threading.ExecutionContext.Run (ExecutionContext executionContext, Callback ContextCallback, Stan obiektu) w System.Threading.ThreadHelper.ThreadStart() InnerException:
EDIT 2: Handler OnPaint z jednego (bardziej skomplikowane) dwóch elementów, które powodują problemy:
private void ValueSlider_Paint(object sender, PaintEventArgs e)
{
using (Graphics g = e.Graphics)
{
g.DrawImage(this.gradientImage, new Rectangle(0, 0, paintArea.Width, paintArea.Height));
if (this.showmarker)
{
ColourHandler.HSV alt = ColourHandler.RGBtoHSV(new ColourHandler.RGB(this.SelectedColour.R, this.SelectedColour.G, this.SelectedColour.B));
alt.Saturation = 0;
alt.value = 255 - alt.value;
using (Pen pen = new Pen(ColourHandler.HSVtoColour(alt)))
{
pen.Width = (float)MARKERWIDTH;
g.DrawRectangle(pen, 0 - pen.Width, this.brightnessPoint.Y - MARKERWIDTH, this.paintArea.Width + (pen.Width * 2), MARKERWIDTH * 2);
}
}
}
}
Proszę udostępnić wyjątek. – roken
@roken Wszystkie twoje przyjacielu. –
Czy nadpisujesz OnPaint() w obraźliwych kontrolkach? Jeśli tak, jak to wygląda? – roken