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

Posted

技术标签:

【中文标题】如何在页面滚动时获取嵌套面板的相对坐标【英文标题】:How to get relative coordinates of a nested panel as page scrolls 【发布时间】:2016-08-27 17:24:41 【问题描述】:

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

我有一个用户控件,附加到它的是一个面板,附加到该面板的是一个具有多行和 1 列的 TableLayoutPanel,并且在每一行中都有一个显示图像的面板。层次结构如下所示:

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),并找到当前显示在屏幕上的那些。我试图通过获取每个面板的位置 (Panel1.Location) 并查看哪个 y 坐标最接近 0,并将其用作我的起点来做到这一点。问题是我似乎无法找到对 PointToScreen、RectangleToClient、RectangleToScreen 等的正确调用组合来获取有用的数据。无论我从这些调用中得到哪个点/矩形,它们要么具有恒定的 y 值(即相对于它们的父 TableLayoutPanel 定义,不移动),要么它们确实随着滚动条移动,但是基于添加了一些常量窗口在屏幕上的位置或其相对于 UserControl 上方的某些其他父元素的位置。

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

我查看了这些 *** 问题(以及许多其他资源),但其中的代码对我的问题没有帮助: 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?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于如何在页面滚动时获取嵌套面板的相对坐标的主要内容,如果未能解决你的问题,请参考以下文章

如何将滚动条从工具箱附加到面板,使其相对于表单/面板展开?

Python,Tkinter:如何在可滚动画布上获取坐标

请教大神 在touchmoved方法中如何获取移动时x y相对触摸点移动了多

javascript 节点获取坐标(相对于屏幕\页面\...)

如何在闪亮中为侧边栏面板添加滚动条?

如何获取相对于持有 onclick 监听器的 SVG 元素的点击坐标?