控件.ClientRectangle与控件.DisplayRectangle的区别

19
我了解有关Form/Control的客户区矩形概念,但我不明白Control.ClientRectangle和Control.DisplayRectangle之间的区别在哪里。
阅读了这两个属性的MSDN页面后,仍然不清楚它们何时会返回不同的值。
ClientRectangle的MSDN页面说:
控件的客户区是控件的边界,减去非客户端元素,如:标题栏、边框、滚动条和菜单。
这很清楚。
然而,DisplayRectangle的MSDN页面说:
对于基本控件类,这与客户端矩形相等。然而,继承控件可能希望更改此值,如果他们的客户区域与显示区域不同。
现在这就不那么清楚了。在继承控件中,我应该在哪里使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

2个回答

41

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

输入图像描述


3
非常感谢你,Lars。这段代码和结果截图真的很有帮助。 - spaceman

4
LarsTech已经提供了一个正确而充分的答案,但我想了解有关各个大小的详细信息。 在我的情况下,我正在使用一个TabControl,这使得事情变得更加困难,但我将尽可能清楚地解释。
我使用的TabControl有2个TabPage。 第一个TabPage上有2个按钮,如屏幕截图所示。第一个按钮位于TabPage的下沿;第二个按钮位于第一个按钮的下面,不可见部分的TabPage中。 由于TabPage1.AutoScroll=true,在实际高度上,TabPage的高度将大于TabControl的高度,您可以从TabPage右边的滚动条中看到。黑色和黄色的斜纹标记了手动复制到此屏幕截图中的不可见区域(包含“button2”)。 第二个TabPage上没有控件。
设置如下:
TabControl.ItemSize = {65; 21}
TabPage1.Padding = {0, 0, 0, 0} 
TabPage2.Padding = {3, 3, 3, 3}

enter image description here

This configuration results in these sizes:

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更大。


嗨,Tobias。这不是LarsTech写的吗?“因此,当您拥有滚动控件时,DisplayRectangle将比ClientRectangle更大,后者仅是屏幕上所看到的区域:”。 - spaceman
3
@spaceman:当然是一样的。因为我们都回答了你的问题,而事实也没有改变。我们只是使用了不同的方法来找到答案。我写我的答案是为了提供一些“数字证据”,以补充LarsTech给出的图形证据。 - Tobias Knauss
@Celess:请看数据行#6,y值(在Load()中为'DisplayRectangle')。 - Tobias Knauss
@TobiasKnauss 对不起,我以为你们在一般性地谈论。我认为另一个人有点苛刻,也想赞扬你提供真实的数据。 - Beeeaaar
删除了我的原始评论,因为它让问题更加混乱。如果可以编辑的话,我会这么做的。 - Beeeaaar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接