Как я могу удалить заполнение границ на элементах управления контейнера в WinForms? - PullRequest
6 голосов
/ 11 февраля 2011

Я установил поля и отступы на 0 0 0 0, но это не влияет на мои TabControls. Посмотрите:

enter image description here

Вот о чем я говорю. Я хочу склеить границы.

Как я могу это сделать?

@ Хенк Холтерман - да, что с ним не так?

Ответы [ 3 ]

11 голосов
/ 11 февраля 2011

В исходном коде TabPage есть комментарий от раздраженного программиста Microsoft (отредактированный для соответствия размеру страницы):

//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);

Визуальные стили были серьезной ошибкой, особенно для TabControl.Проверьте этот ответ для способа выборочного отключения его для TabControl, чтобы вы получили привычное поведение.Конечно, меняет .

2 голосов
/ 11 февраля 2011

Я согласен с Хенком.Вокруг элемента управления контейнером есть граница одинакового размера (9 пикселей, насколько я помню).Причина в том, что вы не можете сдавить элементы управления слишком близко к краю.Если бы вы сделали это наверху, ваш элемент управления был бы слишком близко к заголовкам вкладок наверху.Это выглядело бы глупо и запутало пользователя.WinForms спасает вас от себя здесь, а вы даже не знаете об этом.Именно поэтому это было сделано в первую очередь.

Ознакомьтесь со стандартными рекомендациями Microsoft по пользовательскому интерфейсу, в частности, с разделом в макете .Обратите внимание, как все элементы управления (само диалоговое окно, вкладка и т. Д.) Имеют границы вокруг них?Это 7 диалоговых блоков в редакторе ресурсов Visual C ++;WinForms использует спецификацию пикселей.

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

1 голос
/ 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; }
...