Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Control.ClientRectangle与Control.DisplayRectangle_C#_.net_Winforms - Fatal编程技术网

C# Control.ClientRectangle与Control.DisplayRectangle

C# Control.ClientRectangle与Control.DisplayRectangle,c#,.net,winforms,C#,.net,Winforms,我理解关于表单/控件的客户端矩形的概念, 但我不明白这两者之间的区别是什么 Control.ClientRectangle和Control.DisplayRectangle 在阅读了这两个属性的MSDN页面后,不清楚其中一个属性何时返回与另一个不同的值 .ClientRectangle的MSDN页面显示: 控件的客户区是控件的边界减去 非客户端元素,例如:标题栏、边框、滚动条和菜单 这很清楚 然而.DisplayRectangle的MSDN页面上说: 对于基本控件类,这等于客户端矩形 但是,如果

我理解关于表单/控件的客户端矩形的概念,
但我不明白这两者之间的区别是什么
Control.ClientRectangle
Control.DisplayRectangle

在阅读了这两个属性的MSDN页面后,不清楚其中一个属性何时返回与另一个不同的值

.ClientRectangle
的MSDN页面显示:

控件的客户区是控件的边界减去 非客户端元素,例如:标题栏、边框、滚动条和菜单

这很清楚

然而
.DisplayRectangle
的MSDN页面上说:

对于基本控件类,这等于客户端矩形
但是,如果继承控件的客户端 区域不同于它们的显示区域

现在还不太清楚。。 在继承控件中,我想使
.DisplayRectangle
值不同于
.ClientRectangle
值的位置

控件。ClientRectangle:

控件。显示矩形:

DisplayRectangle是控件的内部画布,因此当您使用滚动控件时,DisplayRectangle将比ClientRectangle大,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);
}

LarsTech已经提供了一个正确且充分的答案,但我想知道各个尺码的详细信息。
在我的例子中,我使用了一个
选项卡控件
,这使得事情变得更加困难,但我会尽量解释清楚

我使用的
TabControl
有2个
TabPage
s.
第一个选项卡页面上有两个按钮,如屏幕截图所示。第一个按钮位于选项卡页面的下边缘;第二个按钮位于选项卡页面不可见部分的第一个按钮下方。
TabPage的实际高度将大于TabControl的高度,因为从TabPage右边缘的滚动条可以看到
TabPage1.AutoScroll=true
。不可见区域(包含“button2”)已手动复制到此屏幕截图中,并用黑色和黄色阴影标记。
第二个选项卡页上没有控件

设置如下:

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

此配置导致以下尺寸:

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
在ctor中:
TabControl:TabPage1:TabPage2:
大小={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”:左+右;“4”:TabControl和TabPage之间的“帧”大小)
//TabPages.Size.y=TabControl.Size.y-2*4-TabControl.ItemSize.y;(“2”:顶部+底部;“4”:如上所述)
//TabPage1:DisplaySize==ClientSize,由于填充=0;TabPage2:DisplaySizeClientSize.y由选项卡页上的按钮引起,AutoScroll=true
调整TabControl的大小(高度+60)后,Tab1中的所有元素现在都直接可见:
TabControl:TabPage1:TabPage2:
大小={300,180}{292,151}{292,91}
ClientSize={300180}{292151}{292191}
DisplaySize={292151}{292151}{28615}
//TabPage1:ClientSize.x==Size.x,因为不需要滚动条,因此不显示滚动条;DisplaySize.y==ClientSize.y,因为所有按钮都是可见的,无需滚动
//注意:Tab2的值没有更新,因为Tab2没有显示;Tab1是所选的选项卡页

从这些值可以看出,如果使用滚动,则
DisplaySize
可以大于
ClientSize

非常感谢您。代码片段和结果截图非常有用。嗨,托比亚斯。这不是拉尔斯泰克写的吗?所以当你有一个滚动控件时,DisplayRectangle会比ClientRectangle大,ClientRectangle只是你在屏幕上看到的区域:@spaceman:当然是一样的。这不会有什么不同,因为我们都回答了你的问题,而事实并没有改变。我们只是用不同的方法找到了答案。我写我的答案是为了给LarsTech提供的图形证据提供某种“数字证据”。