прозрачный фон для tabcontrol в окнах форм - PullRequest
1 голос
/ 25 апреля 2011

Я пытаюсь настроить tabcontrol в компактной среде, но я не могу найти решение для установки прозрачного фона для этого элемента управления.Я пытаюсь переопределить метод "OnPaintBackground ()", чтобы начать задавать фон для него, но эта функция не вызывается.Как я могу использовать эту функцию для вызова при создании элемента управления?

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Я не могу найти ondrowitem в tabcontrol, чтобы переопределить его. Среда Windows CE (SmartDevice) не поддерживает все функциональные возможности в формах Windows

1 голос
/ 25 апреля 2011

РЕДАКТИРОВАТЬ : я прочитал ваш комментарий о попытке установить цвет фона контейнера, а не отдельных вкладок, и я провел некоторые эксперименты и исследования.

Похоже, что метод OnDrawItem класса TabControl используется для рисования «заголовков» вкладок (части элемента управления, содержащей текст каждой вкладки, на которую пользователь нажимает для выбора вкладок), а также фона фона. контейнер (все, кроме содержимого выбранной вкладки, которое рисуется самой вкладкой в ​​методе OnPaintBackground).

Вы можете сделать фон TabControl прозрачным, переопределив его метод OnDrawItem, но простое заполнение границ, переданных с помощью DrawItemEventArgs, также сделает прозрачными заголовки вкладок, делая их недоступными для щелчка (щелчок будет пройти через форму, на то, что за ней).

На мой взгляд, у вас есть несколько вариантов, чтобы попытаться обойти это:

  1. Очистить границы, переданные OnDrawItem, а затем вручную перерисовать каждый заголовок TabPage. Это неприятно, потому что нет способа получить заголовок каждой вкладки, не рассчитав его вручную, используя текст страницы, размер шрифта, границы и кто знает, что еще. Кажется, что нет никакого открытого API для отрисовки заголовков TabPages отдельно от фона TabControl.
  2. Вместо того, чтобы делать фон TabControl и заголовки TabPages полностью прозрачными, делайте их только полупрозрачными, оставляя заголовки кликабельными. Это может выглядеть не так красиво, но это намного проще, чем первый вариант. Для этого вам нужно установить для свойства AllowTransparency формы значение true, а затем использовать следующий код:
    class TransparentisTabControl : TabControl
    {
        //Without declaring this as new, you'd probably get a warning saying this property hides a member of the base class.
        //The base class's BackColor property, as I'm sure you've found out,
        //is hidden with attributes anyway, so it doesn't really matter.
        public new Color BackColor {get; set;}

        public TransparentishTabControl(Color backColor)
        {
            if (backColor.A == 0)
                throw new ArgumentException("The alpha component of backColor cannot be zero, or this TransparentisTabControl's tab pages won't be selectable.");
            BackColor = backColor;
        }

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(fake);
            e.Graphics.Clear(BackColor);
        }
    }

Этот код отлично работает для меня, но на вашей целевой платформе он может работать иначе. Дайте мне знать, если вам нужна дополнительная помощь / разъяснение:)

Вы пытаетесь сделать прозрачным элемент управления вкладками или отдельные вкладки? Переопределение OnPaintBackground в классе с использованием TabControl недостаточно, потому что каждый TabPage также рисует сам. Вам нужен пользовательский класс, производный от TabPage и имеющий переопределение OnPaintBackground.

    class TransparentTabPage : TabPage
    {
        public TransparentTabPage()
            : base("TransparentTabPage")
        {

        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
            base.OnPaintBackground(e);

            Form form = FindForm();

            e.Graphics.CompositingMode = CompositingMode.SourceCopy;
            using (SolidBrush sb = new SolidBrush(form.TransparencyKey))
                e.Graphics.FillRectangle(sb, Bounds);
        }
    }

Чтобы это работало, в вашей форме должно быть установлено значение TransparencyKey, а значение свойства AllowTransparency должно быть равно true.

...