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

时间:2011-02-11 11:04:43

标签: c# .net winforms controls

我将margin和padding设置为0 0 0 0但这对我的TabControls没有任何影响。看:

enter image description here

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

我该怎么做?

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

3 个答案:

答案 0 :(得分:11)

一位愤怒的Microsoft程序员(编辑为适合页面)在TabPage的源代码中留下了一条评论:

//HACK: to ensure that the tabpage draws correctly (the border will get 
//  clipped and gradient fill will match correctly with the tabcontrol).
//  Unfortunately, there is no good way to determine the padding used 
//  on the tabpage.
//  I would like to use the following below, but GetMargins is busted 
//  in the theming API:
//VisualStyleRenderer visualStyleRenderer = new VisualStyleRenderer(VisualStyleElement.Tab.Pane.Normal);
//Padding themePadding = visualStyleRenderer.GetMargins(e.Graphics, MarginProperty.ContentMargins);

Visual Styles是一个主要的bug工厂,特别是TabControl。检查this answer是否有选择性地为TabControl关闭它,这样您就可以获得您习惯的行为。当然 会改变外观。

答案 1 :(得分:2)

我同意Henk。在容器控件周围有一个相同大小的边框(我的记忆中有9个像素)。 原因是为了防止你将控件压得太靠近边缘。如果您在顶部执行此操作,则您的控件将太靠近顶部的选项卡标题。它看起来很愚蠢,让用户感到困惑。 WinForms在这里拯救你自己,你甚至不知道它。确实是它首先完成的原因。

熟悉Microsoft的标准用户界面指南,尤其是section on layout。注意所有控件(对话框窗口本身,选项卡控件等)是如何围绕它们的边框的?它是Visual C ++资源编辑器中的7个对话框单元; WinForms使用像素规范。

sample tab control, with border around edges
spacing around a button control

答案 2 :(得分:1)

试试这个

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