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
если используется прокрутка.