如何查找控件的可见部分?

6

我有一个控件,其父控件是ScrollableControl。我如何找到实际对用户可见的控件部分?两者都是矩形的 - 没有任何区域上的问题。


1
你为什么想知道呢?通常最好解释一下你最终想要实现什么;有时候,别人可能会有一个不直接回答你问题但能得到你想要的结果的想法。 - David Nelson
3个回答

11

我认为下面所写的GetVisibleRectangle方法是你所请求的。 连续滚动运行此方法时,由于控件被滚动而产生了以下输出:

  • {X=0,Y=0,Width=0,Height=0} - 按钮4已滚出视图。 请注意,此处的值为 Rectangle.Empty
  • {X=211,Y=36,Width=25,Height=13} - 按钮4被滚动以使左上角可见
  • {X=161,Y=36,Width=75,Height=13} - 按钮4被滚动以使顶部一半和整个宽度可见
  • {X=161,Y=26,Width=75,Height=23} - 按钮4被滚动以完全可见

请注意,除了宽度和高度的更改外,X,Y值也会随滚动而更改。

来源:

private void button1_Click(object sender, EventArgs e)
{
    Rectangle r = GetVisibleRectangle(this.panel1, button4);
    System.Diagnostics.Trace.WriteLine(r.ToString());
}

public static Rectangle GetVisibleRectangle(ScrollableControl sc, Control child)
{
    Rectangle work = child.Bounds;
    work.Intersect(sc.ClientRectangle);
    return work;
}

太棒了!我只有一个建议,如果你只想知道子控件是否在控件的“可视区域”内,请使用child.Bounds.IntersectsWith(sc.ClientRectangle) - Cipi

3
AutoScrollPosition表示可滚动控件的显示矩形的位置。如果控件已经从其起始位置(0,0)滚动,检索到的X和Y坐标值为负数。当您设置此属性时,必须始终分配正的X和Y值以相对于起始位置设置滚动位置。例如,如果您有一个水平滚动条,并将x和y设置为200,则将滚动向右移动200个像素;如果您将x和y设置为100,则滚动条似乎向左跳了100个像素,因为您将其设置为距离起始位置100个像素。在第一种情况下,AutoScrollPosition返回{-200,0};在第二种情况下,它返回{-100,0}。
来源:MSDN: ScrollableControl.AutoScrollPosition Property

-1

3
当链接失效时,您希望我添加一个简短的摘录以便回答仍然有用。没问题,请问需要翻译哪些内容? - S.L. Barth
4
具有讽刺意味的是,“点赞”已经消失了。这是一个很好的例子。 - Bob
1
如果有摘录就太好了.. :( - AnotherUser

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