【发布时间】:2012-05-17 12:02:01
【问题描述】:
有没有办法在 WinForms 中获取剪辑控件可见部分的大小?
一个很简单的例子:在窗体上放置一个控件,使窗体宽度小于控件宽度。你如何获得控件可见区域的宽度?在这种情况下,您可以使用表单的 ClientSize,但并不总是那么简单。
一个更复杂(和真实)的例子:我有一个标签,其 AutoSize 设置为 true,它可以增长到超出其包含控件的宽度,导致它被剪裁。当这种情况发生时,我需要知道。并不是将标签的宽度与其容器的宽度进行比较那么简单,因为容器也可能有 AutoSize = true 并且也会被裁剪。
目前我的方法是沿着容器树向上走,直到找到一个 AutoSize = false 的容器,然后获取它的宽度。我还必须考虑每个容器的填充。但这仅考虑控件被其容器或其容器的容器等裁剪。如果有问题的控件或任何容器被具有更高 Z 顺序的同级控件裁剪,则它将不起作用。而且我怀疑还有其他方法可以轻松打破这种方法。
将标签 AutoSize 更改为 false 不是一种选择。标签位于设置为 AutoSize 的 UserControl 上,因此当标签增长时,UserControl 也会随之增长。在不使用 AutoSize 的情况下让它工作很痛苦。
我尝试使用的东西,但没有成功:
Control.ClientSize、Control.ClientRectangle、Control.PreferredSize、Control.CreateGraphics().VisibleClipBounds。
我在 Graphics 课上玩过一点儿,但我在那儿不知所措。 Graphics.VisibleClipBounds 听起来很有希望,但似乎总是返回与提到的其他大小属性相同的值。
这特别适用于 WinForms。如果仅此而已,我会对 p/invoke 解决方案感到满意。
我在发帖前做了详尽的搜索。类似的问题都没有帮助。
【问题讨论】:
-
出于好奇,这个解决方案要解决什么问题?
-
@roken:我想知道标签何时比其容器宽,以便我可以添加一个工具提示来显示标签的整个文本,当且仅当整个文本不是可见的。我会使用 Label.AutoEllipsis 属性,但是当 AutoSize 为 true 时这不起作用。
标签: .net winforms graphics controls bounds