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提供的图形证据提供某种“数字证据”。