可能重复:
How can I remove the border padding on container controls in WinForms?
我在Visual Studio 2008中开发了一个Winforms应用程序。在主窗体上,我有一个 Tab控件。现在我尝试在标签页中使用背景图片。我遇到的问题是选项卡控件似乎有一个粗边框。此外,选项卡控件不会覆盖整个表单,在表单和标签页之间的顶部留下一行空格。 (我在底部设置了标签页对齐)。因此,选项卡控件周围的边框和顶部的空格线使我的页面看起来很难看。我尝试提供与背景形成相同的图像,但是选项卡控件填充播放了spoilsport。
任何让我的设计更好的想法都会受到赞赏。
答案 0 :(得分:2)
我同意这里提出的大多数意见。标准的TabControl在微软的Part上绘制得非常糟糕......即使在Windows Vista / 7中它看起来也不是很好!您最好通过继承TabControl然后绘制所需的其他内容来编写自己的自定义实现。
您可以考虑将此作为新控件的模板。您只需要在OnPaint和OnPaintBackground方法中添加一些很酷的设计/绘图工作。
namespace CustomControls
{
#region USING
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
#endregion
public class CustomTabControl : TabControl
{
#region VARIABLES
private int hotTrackTab = -1;
#endregion
#region INSTANCE CONSTRUCTORS
public CustomTabControl() : base()
{
this.InitializeComponent();
}
#endregion
#region INSTANCE METHODS
private void InitializeComponent()
{
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.DrawMode = TabDrawMode.OwnerDrawFixed;
}
private int GetTabUnderCursor()
{
Point cursor = this.PointToClient(Cursor.Position);
for (int index = 0; index < this.TabPages.Count; index++)
{
if (this.GetTabRect(index).Contains(cursor))
{
return index;
}
}
return -1;
}
private void UpdateHotTrack()
{
int hot = GetTabUnderCursor();
if (hot != this.hotTrackTab)
{
if (this.hotTrackTab != -1)
{
this.Invalidate(this.GetTabRect(this.hotTrackTab));
}
this.hotTrackTab = hot;
if (this.hotTrackTab != -1)
{
this.Invalidate(this.GetTabRect(this.hotTrackTab));
}
this.Update();
}
}
#endregion
#region OVERRIDE METHODS
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
this.UpdateHotTrack();
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
this.UpdateHotTrack();
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
this.UpdateHotTrack();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
switch (this.Alignment)
{
case TabAlignment.Bottom:
case TabAlignment.Left:
case TabAlignment.Right:
case TabAlignment.Top:
default:
throw new NotImplementedException();
}
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
base.OnPaintBackground(pevent);
}
#endregion
}
}
请记住,上面的代码绘制了一个绝对空白的TabControl,它只显示DisplayRectangle。其他一切,包括你自己需要做的标签!
此外,要为单个TabPages绘制背景,您可能还需要覆盖和自定义实现TabPage,但是您可以通过自定义选项卡控件实现所需的结果。
检查一下 http://www.codeproject.com/Articles/42046/Customized-TabControl-by-Repainting-Microsoft-s-Pa
恕我直言,这样更好...... http://www.codeproject.com/Articles/38014/KRBTabControl
恕我直言,这还好...... http://www.codeproject.com/Articles/91387/Painting-Your-Own-Tabs-Second-Edition
也看看VB论坛......我知道我在那里看起来有些很棒的自定义标签控件!