2009-05-21 17 views
0

Ich habe eine Winform-App, die Tabcontrols hat, die 3 Ebenen tief sind. Ich färbe die Tabs dynamisch mit der unten stehenden Klasse. Wenn ein eingebetteter Tabcontrol eingefärbt wird, wird eine Anpassung vorgenommen.Benutzerdefinierte Zeichnung von (mehrschichtigen) eingebetteten TabControls Fehler

A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.Windows.Forms.dll 

Muss ich etwas anderes für diese tun? Wenn ich die eingebetteten Formularaufrufe zu tabRenderer auskommentiere, bekomme ich diese Fehler nicht. Vertreibe ich mein TabRenderer-Objekt nicht ordnungsgemäß?

Ist es vielleicht etwas ganz anderes? Die Art, wie ich die Tab-Steuerelemente einbette?

Ein Beispiel von dem, was mein Programm sieht derzeit wie hier ->

http://lh6.ggpht.com/_DqVwi_JXyS0/Sf8EI0ETYrI/AAAAAAAABhI/pmAhozErubo/s288/MATRIXUIExample.JPG Von DevFiles

Wie Sie es 3 Schichten von Registerkarten zu sehen sind. Dies geschieht zweimal im Programm und beide verursachen den erwähnten Fehler. Es gibt insgesamt 6 Aufrufe an tabRenderer, da es 5 Tab-Steuerelemente gibt. 1 oberste Ebene, 3 zweite Ebene und 2 dritte Ebene.

Der Code der Tabulatorsteuerungen verwendet wird, um Farbe:

public class psTabRenderer 
{ 
    private TabControl _tabControl; 
    private Color _fillColor; 
    private Color _selectedFillColor; 
    private Color _textColor; 
    private Color _selectedTextColor; 

    public psTabRenderer(TabControl tabControl, Color fillColor, Color selectedFillColor, Color textColor, Color selectedTextColor) 
    { 
     _tabControl = tabControl; 
     _fillColor = fillColor; 
     _selectedFillColor = selectedFillColor; 
     _textColor = textColor; 
     _selectedTextColor = selectedTextColor; 

     _tabControl.DrawMode = TabDrawMode.OwnerDrawFixed; 
     _tabControl.DrawItem += TabControlDrawItem; 
    } 

    private void TabControlDrawItem(object sender, DrawItemEventArgs e) 
    { 
     TabPage currentTab = _tabControl.TabPages[e.Index]; 
     Rectangle itemRect = _tabControl.GetTabRect(e.Index); 
     var fillBrush = new SolidBrush(_fillColor); 
     var textBrush = new SolidBrush(_textColor); 
     var sf = new StringFormat 
     { 
      Alignment = StringAlignment.Center, 
      LineAlignment = StringAlignment.Center 
     }; 

     //If we are currently painting the Selected TabItem we'll 
     //change the brush colors and inflate the rectangle. 
     if (Convert.ToBoolean(e.State & DrawItemState.Selected)) 
     { 
      fillBrush.Color = _selectedFillColor; 
      textBrush.Color = _selectedTextColor; 
      itemRect.Inflate(2, 2); 
     } 

     //Set up rotation for left and right aligned tabs 
     if (_tabControl.Alignment == TabAlignment.Left || _tabControl.Alignment == TabAlignment.Right) 
     { 
      float rotateAngle = 90; 
      if (_tabControl.Alignment == TabAlignment.Left) 
       rotateAngle = 270; 
      var cp = new PointF(itemRect.Left + (itemRect.Width/2), itemRect.Top + (itemRect.Height/2)); 
      e.Graphics.TranslateTransform(cp.X, cp.Y); 
      e.Graphics.RotateTransform(rotateAngle); 
      itemRect = new Rectangle(-(itemRect.Height/2), -(itemRect.Width/2), itemRect.Height, itemRect.Width); 
     } 

     //Next we'll paint the TabItem with our Fill Brush 
     e.Graphics.FillRectangle(fillBrush, itemRect); 

     //Now draw the text. 
     e.Graphics.DrawString(currentTab.Text, e.Font, textBrush, (RectangleF)itemRect, sf); 

     //Reset any Graphics rotation 
     e.Graphics.ResetTransform(); 

     //Finally, we should Dispose of our brushes. 
     fillBrush.Dispose(); 
     textBrush.Dispose(); 
    } 
} 

Und das ist, wie ich es nennen.

 private void frmMCPEmployment_Load(object sender, EventArgs e) 
    { 
     FormPaint(); 
    } 

    public void FormPaint() 
    { 
     // ToDo: This call to the Tab Renderer is throwing a Win32 "Error Creating Window Handle" 
     new psTabRenderer(tclEmployment, Color.LightSteelBlue, Color.Khaki, Color.Black, Color.Black); 
    } 

Antwort

0

Okay, ich meine eigene Frage beantwortet (ein bisschen)

Ich glaube, was passiert ist, dass, als meine App lädt, es feuert von jedem Forms Load() Ereignis, das wiederum von seinem eingebetteten Forms Load() -Ereignis usw. ausgelöst wird. Ich hatte im Load-Event meinen Aufruf an TabRenderer geworfen und etwas, das ich nicht verstehe, passierte. Ich habe diesen Aufruf an eine PaintTabs() -Funktion gesendet und dann gewartet, bis die erste beendet ist, bevor sie die nächste ruft (denke ich?).

In beiden Fällen werden keine Fehler mehr generiert. Ich nenne es jetzt so von der TOP LEVEL TabControl:

 public void PaintTabs() 
    { 
     new psTabRenderer(tclWWCModuleHost, Color.LightSteelBlue, Color.Khaki, Color.Black, Color.Black); 
     FrmWwcMemberHost.PaintTabs(); 
     FrmWwcMcpHost.PaintTabs(); 
     FrmCaseNotes.PaintTabs(); 
    } 
Verwandte Themen