对不起,如果这对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 screen, How to get the Screen position of a control inside a group box control?
答案 0 :(得分:0)
尝试Panel1.Top + TableLayout1.Top - Panel.VerticalScroll.Value