Control.ClientRectangle vs Control.DisplayRectangle

Я понимаю концепцию Rectangle клиента относительно формы/контроля,
но я не понимаю, в чем разница между Control.ClientRectangle и Control.DisplayRectangle..

После прочтения страниц MSDN для обоих этих свойств неясно, когда один из них вернет другое значение из другого.

На странице MSDN для .ClientRectangle указано:

Клиентская область элемента управления - это границы элемента управления, минус неклиентные элементы, такие как: заголовок, граница, полосы прокрутки и меню.

Это довольно ясно.

Однако на странице MSDN для .DisplayRectangle указано:

Для базового класса управления это равно клиентскому прямоугольнику.
Однако наследование элементов управления может изменить это, если их клиент область отличается от области отображения.

Это не так понятно сейчас.. Где в наследующем контроле я хотел бы сделать значение .DisplayRectangle отличным от .ClientRectangle одного?

Control.ClientRectangle:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.clientrectangle.aspx

Control.DisplayRectangle:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.displayrectangle.aspx

Ответ 1

DisplayRectangle - это внутреннее полотно элемента управления, поэтому, когда у вас есть элемент управления прокруткой, DisplayRectangle будет больше, чем ClientRectangle, что является только областью того, что вы видите на экране:

panel1.AutoScrollMinSize = new Size(0, panel1.Height * 2);
panel1.Paint += panel1_Paint;

void panel1_Paint(object sender, PaintEventArgs e) {
  e.Graphics.FillEllipse(Brushes.Red, panel1.DisplayRectangle);
  e.Graphics.DrawEllipse(Pens.Green, panel1.ClientRectangle);
}

введите описание изображения здесь

Ответ 2

LarsTech уже дал правильный и достаточный ответ, но я хотел узнать подробности об индивидуальных размерах.
В моем случае я использую TabControl, что еще более усложняет ситуацию, но я постараюсь объяснить как можно более четко.

TabControl я использовал, имеет 2 TabPage s.
На первой вкладке есть две кнопки, расположенные, как показано на скриншоте. 1-я кнопка расположена в нижней части вкладки; 2-я кнопка расположена под первой в невидимой части TabPage.
Фактическая высота TabPage будет больше, чем высота TabControl из-за TabPage1.AutoScroll=true, который вы можете увидеть на полосе прокрутки на правом краю TabPage. Невидимая область (содержащая "button2") была скопирована в этот снимок экрана вручную и отмечена черным и желтым штриховкой.
На второй вкладке нет элементов управления.

Настройки следующие:

TabControl.ItemSize = {65; 21}
TabPage1.Padding = {0, 0, 0, 0} 
TabPage2.Padding = {3, 3, 3, 3}

enter image description here

Эта конфигурация приводит к следующим размерам:

in ctor:
              TabControl:   TabPage1:     TabPage2:
Size        = {300, 120}    {292,  91}    {292,  91}
ClientSize  = {300, 120}    {292,  91}    {292,  91}
DisplaySize = {292,  91}    {292,  91}    {286,  85}
// TabPages.Size.x = TabControl.Size.x - 2 * 4;                          ("2": left+right; "4": "frame" size between TabControl and TabPage)
// TabPages.Size.y = TabControl.Size.y - 2 * 4 - TabControl.ItemSize.y;  ("2": top+bottom; "4": like above)
// TabPage1: DisplaySize == ClientSize due to Padding=0; TabPage2: DisplaySize < ClientSize due to Padding=3

in Load():
              TabControl:   TabPage1:     TabPage2:
Size        = {300, 120}    {292,  91}    {292,  91}
ClientSize  = {300, 120}    {275,  91}    {292,  91}
DisplaySize = {292,  91}    {275, 142}    {286,  85}
// TabPage1: ClientSize.x < Size.x due to ScrollBar; DisplaySize.y > ClientSize.y due to Buttons on the TabPage and AutoScroll=true

after Resize of TabControl (height +60), all elements in Tab1 directly visible now:
              TabControl:   TabPage1:     TabPage2:
Size        = {300, 180}    {292, 151}    {292,  91}
ClientSize  = {300, 180}    {292, 151}    {292,  91}
DisplaySize = {292, 151}    {292, 151}    {286,  85}
// TabPage1: ClientSize.x == Size.x because ScrollBar is not needed and therefore not shown; DisplaySize.y == ClientSize.y because all Buttons are visible also without scrolling
// NOTICE: values of Tab2 are NOT UPDATED because Tab2 is not shown; Tab1 is the selected TabPage

Как видно из значений, DisplaySize может быть больше, чем ClientSize если используется прокрутка.