如何在页面滚动时获取嵌套面板的相对坐标

时间:2016-05-02 20:23:39

标签: c# winforms

对不起,如果这对WinForms用户来说是一个微不足道的问题,我来自游戏编程的背景,而且WinForms API与我以前用于在游戏中做UI的非常不同,这是我第一次使用WinForms。

我有一个UserControl,附加到Panel上,附加到该面板的是一个TableLayoutPanel,有许多行和1列,并且每个行中都有一个显示图像的Panel。层次结构如下所示:

UserControl
|- Panel (I use this one to scroll the child of this)
   |- TableLayoutPanel (many rows, 1 column, one panel per row)
      |- Panel1 (contains an image)
      |- Panel2 (contains an image)
      ...
      |- PanelN (contains an image)

每个行以及它们中的面板都是在运行时创建的。

现在,由于TableLayoutPanel通常太高而无法放在一个屏幕上,因此我将其父面板设置为滚动。

所以这是我的问题:我需要能够搜索所有叶子面板(Panel1 - PanelN),并找到当前显示在屏幕上的那些。我试图通过获取每个Panel的位置(Panel1.Location),并查看哪个y坐标最接近0,并将其作为我的起点。问题是我似乎找不到调用PointToScreen,RectangleToClient,RectangleToScreen等的正确组合来获取有用的数据。无论从这些调用得到哪个Point / Rectangle,它们要么具有常量的y值(即相对于它们的父TableLayoutPanel定义,而不是移动),要么它们随滚动条移动,但是有一些常量添加基于窗口在屏幕上的位置或相对于UserControl上方某些其他父元素的位置。

当滚动条(在面板上)一直位于页面顶部时,我需要进行哪些调用才能使Panel1的位置返回(x,0),并开始返回负数(x,当用户向下滚动时,y< 0)?

我已经查看了这些stackoverflow问题(以及其他一些资源),但是其中的代码对我的问题没有帮助: Getting The Location Of A Control Relative To The Entire Screen?c# absolute position of control on screenHow to get the Screen position of a control inside a group box control?

1 个答案:

答案 0 :(得分:0)

尝试Panel1.Top + TableLayout1.Top - Panel.VerticalScroll.Value