更改其tabControls tabPages和表单的BackColor时,每个BackColor都有这些视觉故障,如下图所示:

  • tabPage的顶部,有一个内部一像素的白色边框。
  • tabPage的左侧,有一个内部三像素白色边框。
  • tabPage的底部,有一个内部一像素白色边框和一个外部两像素白色边框。
  • tabPage的右侧,有一个内部一像素白色边框和一个外部两像素白色边框。



  • 有什么方法可以摆脱那些白色边框吗?

    最佳答案

    这是我尝试的骇客。我使用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);
    }
    

    我的最终结果:

    关于c# - TabControl和边界视觉故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7768555/

    10-12 12:35