У меня есть несколько пользовательских компонентов (winforms), которые выводятся на экран с помощью GDI +.
Чтобы предотвратить мерцание при перерисовке, я решил включить двойную буферизацию, поэтому добавил в свой конструктор строку:
public ColourWheel()
{
InitializeComponent();
this.DoubleBuffered = true;
}
Что отлично работает с этим компонентом (ColourWheel). Когда я добавляю ту же строку в конструктор любого из двух других (аналогичных по структуре) компонентов, я получаю пару странных симптомов:
- Когда я пытаюсь запустить форму с включенным компонентом, я получаю исключение аргумента на
Application.Run(new Form());
. - Если я переключаюсь в режим разработки, я получаю сообщение об ошибке компонента, имеющего необработанное исключение, связанное с параметром.
Кажется, не имеет значения, включаю ли я двойную буферизацию на одном или на всех, она по-прежнему работает на ColourWheel, но не на других.
Для записи, я также пробовал несколько других double методы буферизации.
Что могло заставить двойную буферизацию работать на одном компоненте, но не на других?
РЕДАКТИРОВАТЬ: Вот подробности исключения из симптома во время выполнения:
Необработанное исключение System.ArgumentException Сообщение = Параметр недействителен. Источник = System.Drawing StackTrace: в System.Drawing.Graphics.GetHdc () в System.Drawing.BufferedGraphics.RenderInternal (HandleRef refTargetDC, буфер BufferedGraphics) в System.Drawing.BufferedGraphics.Render () в System.Windows.Forms.Control .WmPaint (Message & m) в System.Windows.Forms.Control.WndProc (Message & m) в System.Windows.Forms.ScrollableControl.WndProc (Message & m) в System.Windows.Forms.UserControl.WndProc (Message & m) в System .Windows.Forms.Control.ControlNativeWindow.OnMessage (сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (сообщение & m) в System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam IntPtr lparam) в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG & msg) в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLo op (IntPtr dwComponentID, причина Int32, Int32 pvLoopData) в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (причина Int32, контекст ApplicationContext) в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Int32) в причине, в контексте ApplicationContext. System.Windows.Forms.Application.Run (форма mainForm) в TestForm.Program.Main () в D: \ Documents and Settings \ Tom Wright \ My Documents \ Visual Studio 2010 \ Projects \ ColourPicker \ TestForm \ Program.cs: line 18 в System.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, аргументы String []) в System.AppDomain.ExecuteAssembly (String AssemblyFile, Evidence assemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading .ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.Run (контекст выполнения ExecutionContext, обратный вызов ContextCallback, состояние объекта, B oolean ignoreSyncCtx) в System.Threading.ExecutionContext.Run (ExecutionContext executionContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException:
РЕДАКТИРОВАТЬ 2: обработчик OnPaint из одного (более сложного) из двух компонентов, вызывающих проблемы:
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);
}
}
}
}