Frage

Ich habe eine Winform-Anwendung, die TabControls, die 3 Schichten tief hat. Ich Färbung dynamisch die Registerkarten mit den folgenden Klasse. Wenn es geht ein eingebettetes tabcontrol einzufärben Stellplätze es einen Anfall.

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

Muss ich etwas anderes für diejenigen tun? Wenn ich die eingebetteten Formen kommentieren Sie ruft tabRenderer dann bekomme ich diese Fehler nicht. Bin ich nicht richtig mein TabRenderer Objekt entsorgen?

Ist es etwas, vielleicht ganz anderes? Die Art, wie ich bin embeding die Registerkarte Kontrollen?

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


(Quelle: ggpht.com )
Von DevFiles

Wie Sie sehen können, gibt es drei Schichten von Registerkarten. Dies geschieht zweimal im Programm und beide führen die genannten Fehler. Es gibt 6 Anrufe tabRenderer insgesamt, da es 5 Registerkarten. 1 Top Level, 3 Second Level und 2 dritte Ebene.

Der Code verwendet wird, um die Tab-Steuerelemente 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);
    }
War es hilfreich?

Lösung

Okay, antwortete ich meine eigene Frage. (Irgendwie)

Ich glaube, was passiert war, dass als mein App lädt sie beginnt jedes Forms Load () Ereignis, das wiederum Feuer den es eingebettet Forms Load () Ereignis und so weiter abzuzufeuern. Ich hatte meinen Anruf TabRenderer in dem Load-Ereignis und etwas geworfen, das verstehe ich nicht geschah. Ich zog, dass rufen zu einem PaintTabs () -Funktion und dann zum ersten warten zu beenden, bevor er die nächsten Anrufen (glaube ich?).

oder so ist es nicht mehr generiert Fehler. Ich nenne es jetzt wie so von der obersten Ebene TabControl:

        public void PaintTabs()
    {
        new psTabRenderer(tclWWCModuleHost, Color.LightSteelBlue, Color.Khaki, Color.Black, Color.Black);
        FrmWwcMemberHost.PaintTabs();
        FrmWwcMcpHost.PaintTabs();
        FrmCaseNotes.PaintTabs();
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top