Pergunta

Eu tenho um aplicativo winform que tem tabcontrols que são 3 camadas de profundidade. Estou coloração dinamicamente as guias com a classe abaixo. Quando ele vai para colorir um tabcontrol incorporado que lança um ajuste.

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

Eu preciso fazer algo diferente para aqueles? Se eu comentar os formulários incorporados chamadas para tabRenderer então eu não obter esses erros. Não estou a eliminação de meu objeto TabRenderer corretamente?

É talvez algo totalmente diferente? A maneira que eu estou embeding os controles de guia?

Um exemplo do que meu programa parece actualmente como é aqui ->


(fonte: ggpht.com )
De DevFiles

Como você pode ver, existem 3 camadas de controles de guia. Isto ocorre duas vezes no programa e tanto a causa do mencionado erro. Há 6 chamadas para tabRenderer no total, existem 5 controles de guia. 1 Nível Superior, 3 de segundo nível e 2 terceiro nível.

O código a ser usado para colorir os controles de guia:

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();
    }
}

E é assim que eu chamá-lo:

        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);
    }
Foi útil?

Solução

Ok, eu respondi minha própria pergunta. (Kinda)

Eu acredito que estava acontecendo era que, como meus cargas app ele começa a disparar cada Formas Load () evento que em incêndios volta dele é incorporado Formas Load () do evento e assim por diante. Eu tinha jogado minha chamada para TabRenderer na carga do evento e algo que eu não entendo estava acontecendo. Tirei essa chamada para uma função PaintTabs () e aguarde o primeiro a terminar antes que ele chama o próximo (eu acho?).

De qualquer maneira, não gera quaisquer erros. Eu agora chamo ele assim do TOP LEVEL TabControl:

        public void PaintTabs()
    {
        new psTabRenderer(tclWWCModuleHost, Color.LightSteelBlue, Color.Khaki, Color.Black, Color.Black);
        FrmWwcMemberHost.PaintTabs();
        FrmWwcMcpHost.PaintTabs();
        FrmCaseNotes.PaintTabs();
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top