Пользовательский рисунок (многослойного) встроенного элемента управления TabControls. Ошибка

StackOverflow https://stackoverflow.com/questions/894607

Вопрос

У меня есть приложение winform, в котором есть элементы управления вкладками, состоящие из трех слоев.Я динамически раскрашиваю вкладки с помощью приведенного ниже класса.Когда дело доходит до цвета встроенного элемента управления вкладками, это вызывает приступ.

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

Нужно ли мне делать для них что-то другое?Если я закомментирую вызовы встроенных форм в tabRenderer, я не получу этих ошибок.Я неправильно избавляюсь от своего объекта TabRenderer?

Может быть, дело совсем в другом?Как я встраиваю элементы управления вкладками?

Пример того, как моя программа выглядит сейчас, находится здесь -->


(источник: ggpht.com)
От DevFiles

Как вы можете видеть, существует три слоя элементов управления вкладками.Это происходит в программе дважды, и оба вызывают указанную ошибку.Всего существует 6 вызовов tabRenderer, поскольку имеется 5 элементов управления вкладками.1 верхний уровень, 3 второго уровня и 2 третьего уровня.

Код, используемый для раскрашивания элементов управления вкладками:

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

И вот как я это называю:

        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);
    }
Это было полезно?

Решение

Хорошо, я ответил на свой вопрос. (вроде как)

Я полагаю, что происходит то, что по мере загрузки моего приложения оно начинает запускать каждое событие Forms Load(), которое, в свою очередь, запускает встроенное событие Forms Load() и так далее.Я отправил вызов TabRenderer в событии загрузки, и произошло что-то, чего я не понимаю.Я перенес этот вызов в функцию PaintTabs(), а затем дождался завершения первого, прежде чем он вызовет следующий (я думаю?).

В любом случае ошибок больше не будет.Теперь я называю это так из TabControl TOP LEVEL:

        public void PaintTabs()
    {
        new psTabRenderer(tclWWCModuleHost, Color.LightSteelBlue, Color.Khaki, Color.Black, Color.Black);
        FrmWwcMemberHost.PaintTabs();
        FrmWwcMcpHost.PaintTabs();
        FrmCaseNotes.PaintTabs();
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top