TabControl и границы визуального сбоя - PullRequest
14 голосов
/ 14 октября 2011

У меня есть эти визуальные глюки на каждом tabControls, когда я меняю его tabPages BackColor и BackColor формы, как показано на следующих изображениях:

  • ВВ верхней части tabPage есть внутренняя белая граница с одним пикселем.
  • С левой стороны от tabPage есть внутренняя белая граница с тремя пикселями.
  • Ввнизу tabPage, есть внутренняя белая граница с одним пикселем и внешняя белая граница с двумя пикселями.
  • Справа от tabPage есть внутренняя белая граница с одним пикселеми внешняя двухпиксельная белая рамка.

Top and left borders Bottom borders Top and right borders

Есть ли способ избавиться от этих белых границ?

Ответы [ 4 ]

17 голосов
/ 16 октября 2011

Вот моя попытка взломать.Я использовал NativeWindow, чтобы рисовать поверх TabControl, чтобы заполнить эти "белые" пробелы.Я не буду утверждать, что он идеален:

public class TabPadding : NativeWindow {
  private const int WM_PAINT = 0xF;

  private TabControl tabControl;

  public TabPadding(TabControl tc) {
    tabControl = tc;
    tabControl.Selected += new TabControlEventHandler(tabControl_Selected);
    AssignHandle(tc.Handle);
  }

  void tabControl_Selected(object sender, TabControlEventArgs e) {
    tabControl.Invalidate();
  }

  protected override void WndProc(ref Message m) {
    base.WndProc(ref m);

    if (m.Msg == WM_PAINT) {
      using (Graphics g = Graphics.FromHwnd(m.HWnd)) {

        //Replace the outside white borders:
        if (tabControl.Parent != null) {
          g.SetClip(new Rectangle(0, 0, tabControl.Width - 2, tabControl.Height - 1), CombineMode.Exclude);
          using (SolidBrush sb = new SolidBrush(tabControl.Parent.BackColor))
          g.FillRectangle(sb, new Rectangle(0, 
                                            tabControl.ItemSize.Height + 2,
                                            tabControl.Width,
                                            tabControl.Height - (tabControl.ItemSize.Height + 2)));
        }

        //Replace the inside white borders:
        if (tabControl.SelectedTab != null) {
          g.ResetClip();
          Rectangle r = tabControl.SelectedTab.Bounds;
          g.SetClip(r, CombineMode.Exclude);
          using (SolidBrush sb = new SolidBrush(tabControl.SelectedTab.BackColor))
            g.FillRectangle(sb, new Rectangle(r.Left - 3,
                                              r.Top - 1,
                                              r.Width + 4,
                                              r.Height + 3));
        }
      }
    }
  }
}

И подключить его:

public Form1() {
  InitializeComponent();
  var tab = new TabPadding(tabControl1);
}

Мой конечный результат:

enter image description here

5 голосов
/ 17 августа 2015

вы можете наследовать от контроля

public class TabControlEx : TabControl
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x1300 + 40)
        {
            RECT rc = (RECT)m.GetLParam(typeof(RECT));
            rc.Left -= 0;
            rc.Right += 3;
            rc.Top -= 0;
            rc.Bottom += 3;
            Marshal.StructureToPtr(rc, m.LParam, true);
        }
        base.WndProc(ref m);
    }

}
internal struct RECT { public int Left, Top, Right, Bottom; }
0 голосов
/ 24 августа 2017

используйте MaterialSkin, добавьте MaterialSkin из пакета NuGet [щелкните правой кнопкой мыши свое решение - выберите Управление пакетами NuGet - найдите MaterialSkin.dll], затем перетащите MaterialSkin.dll в свою панель инструментов и используйте вкладку темы оформления материала. Control

0 голосов
/ 30 марта 2016

Я недавно столкнулся с этой проблемой и никогда не находил хорошего простого решения.Именно тогда я подумал о простой настройке области отсечения элемента управления.Казалось, что это работает просто отлично без каких-либо заметных побочных эффектов.2 дополнительных белых пикселя справа и один дополнительный белый пиксель внизу больше не видны.

class TabControlEx : TabControl
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0005) // WM_SIZE
        {
            int Width = unchecked((short)m.LParam);
            int Height = unchecked((short)((uint)m.LParam >> 16));

            // Remove the annoying white pixels on the outside of the tab control
            // by adjusting the control's clipping region to exclude the 2 pixels
            // on the right and one pixel on the bottom.
            Region = new Region(new Rectangle(0, 0, Width - 2, Height - 1));
        }

        base.WndProc(ref m);
    }
}
...