2010-03-24 3 views
4

Pour notre projet, nous avons écrit un WinForms UserControl pour la représentation graphique.Winforms TabControl provoquant de faux événements Paint pour UserControl

Nous observons un comportement étrange lorsque notre contrôle est situé dans un TabControl - notre contrôle déclenche continuellement des événements Paint, même lorsqu'il n'y a absolument aucune activité de la part de l'utilisateur.

Nous voyons seulement ceci dans le TabControl. Lorsque nous localisons notre contrôle dans d'autres conteneurs tels que Formulaires ou Séparateurs, Paint est uniquement déclenché lorsque vous vous attendez, par exemple, à ce que lorsque le contrôle est affiché en premier, etc.

Quelqu'un peut-il suggérer pourquoi cela pourrait se produire?

Voici une trace de pile à partir d'un point d'arrêt dans le gestionnaire Paint de notre contrôle, si cela peut vous aider. Notre contrôle est BaseGraphXY, qui est situé sur un TabControl, qui est situé sur certains SplitContainers imbriqués. Désolé pour le formatage - impossible pour l'éditeur SO d'arrêter l'emballage, pour une raison quelconque.

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

La trace de la pile est entièrement normale, ce à quoi vous vous attendez lorsque Invalidate a été appelée sur le contrôle et que DoubleBuffered s'est activé. Je n'ai jamais entendu parler de TabControl induisant cela. –

+0

Utilisez-vous SetStyle? – eschneider

+0

Non, nous ne sommes pas. Peut-être que nous devrions être - merci pour le pourboire. –

Répondre

0

Mon collègue a trouvé une solution pour le problème:

le problème avec le contrôle graphique a été que la propriété BackColor a été Défaillant à System.Dra wing.Color.Transparent. Cela a provoqué une sorte de "boucle de rétroaction" des messages. Je suppose que c'est censé fonctionner de cette façon? De toute façon, j'ai changé le constructeur pour utiliser System.Drawing.SystemColors.ControlLightLight comme propriété BackColor par défaut. Cela semble supprimer la peinture graphique supplémentaire.

1

Tab contrôle a quelques bizarreries, essayez bricoler avec SetStyle:

Me.SetStyle (ControlStyles.UserPaint Ou ControlStyles.AllPaintingInWmPaint Ou ControlStyles.OptimizedDoubleBuffer Ou ControlStyles.DoubleBuffer Ou ControlStyles.Selectable Ou ControlStyles.ResizeRedraw , True)

Questions connexes