Igb*_*man 6 .net graphics controls winforms bounds
有没有办法在WinForms中获取剪切控件的可见部分的大小?
一个非常简单的示例:在窗体上放置一个控件,使窗体宽度小于控件宽度.如何获得控件可见区域的宽度?在这种情况下,您可以使用表单的ClientSize,但并不总是这么简单.
一个更复杂(和真实)的例子:我有一个标签,AutoSize设置为true,它可以超出其包含控件的宽度,导致它被剪裁.当发生这种情况时,我需要知道.它不像将标签的宽度与其容器的宽度进行比较那么简单,因为容器也可能具有AutoSize = true并且也被剪裁.
目前我的方法是走向容器树,直到找到一个AutoSize = false的容器,并获得它的宽度.我还必须考虑每个容器的填充.但是这只考虑控件被其容器或容器的容器等夹住.如果有问题的控件或任何容器被具有更高Z顺序的同级控件剪切,则无法工作.我怀疑还有其他方法可以轻易打破这种方法.
将标签AutoSize更改为false不是一个选项.标签位于UserControl上,该控件设置为AutoSize,以便在标签增长时,UserControl随之增长.在不使用AutoSize的情况下使其工作非常痛苦.
我尝试使用的东西,但没有成功:
Control.ClientSize,Control.ClientRectangle,Control.PreferredSize,Control.CreateGraphics().VisibleClipBounds.
我已经玩了一下Graphics类,但我在那里.Graphics.VisibleClipBounds听起来很有希望,但似乎总是与所提到的其他尺寸属性相同.
这与WinForms有关.如果有的话,我会对ap/invoke解决方案感到满意.
在发布之前我确实做了详尽的搜索.没有类似的问题是有帮助的.
小智 6
您可以为此使用 Control.ClientRectangle。您需要做的是在爬树时获取每个控件的屏幕边界,并计算交集。
它会是这样的:
Control c = myControl;
var rect = c.RectangleToScreen(c.ClientRectangle);
while (c != null) {
rect = Rectangle.Intersect(rect, c.RectangleToScreen(c.ClientRectangle));
c = c.Parent;
}
rect = myControl.RectangleToClient(rect);
Run Code Online (Sandbox Code Playgroud)
现在这应该对您有用,但是为了解决您决定何时绘制椭圆的问题,我建议改为引入更好的控件大小。如果每个控件都适当调整大小,那么它需要的所有信息都是它自己的大小来决定如何绘制它的内容,这通常会更好。
您描述的问题是自动调整大小方案的典型问题。您希望它自动调整大小,但在容器太小时也会受到限制。我尽量避免自动调整大小,而是通过覆盖 OnSizeChanged 来使用 Dock 属性和自定义布局登录。不过,这可能会也可能不会满足您的需求。