2010-03-24 3 views
4

우리 프로젝트에서는 그래프 작성을 위해 WinForms UserControl을 작성했습니다.Winforms TabControl은 UserControl에 대한 가짜 페인트 이벤트를 발생시킵니다.

우리의 컨트롤이 TabControl에 위치 할 때 우리는 이상한 행동을 보았습니다. 우리의 컨트롤은 사용자가 전혀 활동하지 않을 때에도 계속 페인트 이벤트를 발생시킵니다.

우리는 TabControl에서만 이것을 볼 수 있습니다. Forms 나 Splitters와 같은 다른 컨테이너에 컨트롤을 배치 할 때 페인트는 예를 들어 예기 할 때만 실행됩니다. 컨트롤이 처음 표시 될 때

왜 이런 일이 일어날 수 있는지 제안 할 수 있습니까?

여기에는 컨트롤의 그림판 핸들러에있는 중단 점의 스택 추적이 있습니다 (도움이 필요하다면). 우리의 제어는 TabControl에 위치하는 BaseGraphXY입니다. TabControl은 중첩 된 SplitContainers에 위치합니다. 형식화에 대해 죄송합니다. SO 편집기에서 줄 바꿈을 중지 할 수 없습니다. 이유가 있습니다.

Me.SetStyle (ControlStyles.UserPaint 또는 ControlStyles.AllPaintingInWmPaint 또는 ControlStyles.OptimizedDoubleBuffer 또는 ControlStyles.DoubleBuffer 또는 ControlStyles.Selectable 또는 ControlStyles.ResizeRedraw :

OverlordFrontEnd.exe!OverlordFrontEnd.MainForm.graphControl_Paint(object sender = BI_BaseGraphXY.BaseGraphXY}, System.Windows.Forms.PaintEventArgs e = {ClipRectangle = {X=0,Y=0,Width=1031,Height=408}}) Line 422 C# 
System.Windows.Forms.dll!System.Windows.Forms.Control.OnPaint(System.Windows.Forms.PaintEventArgs e) + 0x73 bytes 
BI_AppCore.dll!BI_BaseGraphXY.BaseGraphXY.OnPaint(System.Windows.Forms.PaintEventArgs e = {ClipRectangle = {X=0,Y=0,Width=1031,Height=408}}) Line 377 + 0xb bytes C# 
System.Windows.Forms.dll!System.Windows.Forms.Control.PaintTransparentBackground(System.Windows.Forms.PaintEventArgs e, System.Drawing.Rectangle rectangle, System.Drawing.Region transparentRegion = null) + 0x16c bytes 
System.Windows.Forms.dll!System.Windows.Forms.Control.PaintBackground(System.Windows.Forms.PaintEventArgs e = {ClipRectangle = {X=0,Y=0,Width=1029,Height=406}}, System.Drawing.Rectangle rectangle, System.Drawing.Color backColor, System.Drawing.Point scrollOffset) + 0xbc bytes  
System.Windows.Forms.dll!System.Windows.Forms.Control.PaintBackground(System.Windows.Forms.PaintEventArgs e, System.Drawing.Rectangle rectangle) + 0x63 bytes 
System.Windows.Forms.dll!System.Windows.Forms.Control.OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent) + 0x59 bytes  
System.Windows.Forms.dll!System.Windows.Forms.Control.PaintWithErrorHandling(System.Windows.Forms.PaintEventArgs e = {ClipRectangle = {X=0,Y=0,Width=1029,Height=406}}, short layer, bool disposeEventArgs = false) + 0x74 bytes  
System.Windows.Forms.dll!System.Windows.Forms.Control.WmPaint(ref System.Windows.Forms.Message m) + 0x1ba bytes 
System.Windows.Forms.dll!System.Windows.Forms.Control.WndProc(ref System.Windows.Forms.Message m) + 0x33e bytes 
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.OnMessage(ref System.Windows.Forms.Message m) + 0x10 bytes  
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.WndProc(ref System.Windows.Forms.Message m) + 0x31 bytes 
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Callback(System.IntPtr hWnd, int msg = 15, System.IntPtr wparam, System.IntPtr lparam) + 0x5a bytes 
[Native to Managed Transition] 
[Managed to Native Transition] 
System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(int dwComponentID, int reason = -1, int pvLoopData = 0) + 0x24e bytes 
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(int reason = -1, System.Windows.Forms.ApplicationContext context = {Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.WinFormsAppContext}) + 0x177 bytes  
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop(int reason, System.Windows.Forms.ApplicationContext context) + 0x61 bytes  
System.Windows.Forms.dll!System.Windows.Forms.Application.Run(System.Windows.Forms.ApplicationContext context) + 0x18 bytes 
Microsoft.VisualBasic.dll!Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() + 0x81 bytes  
Microsoft.VisualBasic.dll!Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() + 0xef bytes 
Microsoft.VisualBasic.dll!Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(string[] commandLine) + 0x2c0 bytes 
OverlordFrontEnd.exe!OverlordFrontEnd.Program.Main() Line 36 + 0x10 bytes C# 
[Native to Managed Transition] 
[Managed to Native Transition] 
mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x3a bytes  
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x2b bytes 
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x66 bytes 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f bytes  
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes 
+0

스택 추적은 완전히 정상이며, 컨트롤에서 Invalidate가 호출되고 DoubleBuffered가 켜져있을 때 예상되는 내용입니다. 나는 이것을 유도하는 TabControl에 대해 들어 본 적이 없다. –

+0

SetStyle을 사용하고 있습니까? – eschneider

+0

아니, 우리가 아니야. 어쩌면 우리는 팁을 가져 주셔서 감사합니다. –

답변

0

내 동료는 문제에 대한 해결 방법을 발견했다 날개 .Color.Transparent입니다. 이로 인해 일종의 "피드백 루프"가 발생했습니다. 나는 그것이이 방법으로 작동한다고 생각해? 어쨌든, System.Drawing.SystemColors.ControlLightLight를 기본 BackColor 속성으로 사용하도록 생성자를 변경했습니다. 이것은 여분의 그래프 페인팅을 억제하는 것처럼 보입니다.

1

탭 컨트롤은 몇 가지 단점을 가지고하는 SetStyle 땜질하려고하지

그래프 컨트롤의 문제가 BackColor 속성이 System.Dra을 디폴트 된 것을 : 진정한는)