C# 如何删除WinForms中容器控件上的边框填充?

C# 如何删除WinForms中容器控件上的边框填充?,c#,.net,winforms,controls,C#,.net,Winforms,Controls,我将边距和填充设置为0,但这对选项卡控件没有任何影响。看: 这就是我要说的。我想把边界粘在一起 我该怎么做 @Henk Holterman-是的,有什么问题吗?我同意Henk的观点。容器控件周围有一个大小相同的边框(我记得是9个像素)。它的存在是为了防止控件挤压到离边缘太近的位置。如果在顶部执行此操作,控件将与顶部的选项卡标题过于接近。这看起来很傻,会让用户感到困惑。WinForms在这里救了你一命,你甚至都不知道。这正是当初这么做的原因 熟悉Microsoft的标准用户界面指南,特别是。注意

我将边距和填充设置为0,但这对选项卡控件没有任何影响。看:

这就是我要说的。我想把边界粘在一起

我该怎么做


@Henk Holterman-是的,有什么问题吗?

我同意Henk的观点。容器控件周围有一个大小相同的边框(我记得是9个像素)。它的存在是为了防止控件挤压到离边缘太近的位置。如果在顶部执行此操作,控件将与顶部的选项卡标题过于接近。这看起来很傻,会让用户感到困惑。WinForms在这里救了你一命,你甚至都不知道。这正是当初这么做的原因

熟悉Microsoft的标准用户界面指南,特别是。注意所有控件(对话框窗口本身、选项卡控件等)的周围都有边框吗?它是Visual C++资源编辑器中的7个对话框单元;WinForms使用像素规范



在TabPage的源代码中有一条评论,是一位愤怒的Microsoft程序员留下的(经过编辑以适应页面):

视觉样式一直是一个主要的bug工厂,尤其是对于TabControl。检查TabControl是否有选择地将其关闭,以便获得习惯的行为。当然,它确实会改变外观。

试试这个

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

您是否考虑过控件顶部(选项卡侧)的外观?但它看起来有点奇怪。。。VCL允许我使用任何保证金。检查我的屏幕截图。我不需要3x7像素。@nCdy:我不知道VCL是什么。这是设计时还是运行时的屏幕截图?无论哪种方式,如果你觉得这样看起来很有趣,我建议你扩大边界而不是压缩边界。空白不仅仅在代码中有价值,它来自运行时。哦那么我将努力消除边界。
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; }