【问题标题】:How to get a control that is underneath another control?如何获得位于另一个控件之下的控件?
【发布时间】:2013-09-27 17:29:32
【问题描述】:

我正在尝试创建一个有趣的基本地图编辑器,它由滚动框和绘画框组成(用于绘制网格)。

在油漆盒的 OnMouseDown 事件中,我在运行时创建图像并将它们添加到滚动框内,网格油漆盒被绘制在图像上方(因为如果网格位于后面,它看起来就不好看)。

这是一个示例屏幕:

我的问题将解决我的两个问题。

  • 我需要能够在运行时拖放(移动)图像。
  • 我还需要能够获取图像的 X 和 Y 位置以显示为信息。

这就是我的问题所在,要解决上述问题,我首先需要获取鼠标光标下的图像。但是因为我在图像上方绘制了我的网格(画框),所以光标只会“看到”画框网格,而不是底层图像。

我确实尝试将彩绘箱网格复制到 TImage,但结果完全错误,并且出现内存不足错误。地图的大小可能非常大,因此由于内存和限制等原因,将网格放到位图上并不理想。

网格必须在顶部,否则看起来像这样:

这隐藏了网格,我不希望这种情况发生。

那么,我如何使用 FindVCLWindow 或类似的东西看过去画框并到达下面的图像?

【问题讨论】:

  • 我想我会避免将地图存储在 GUI 控件中。将其存储在专用的数据结构中,并使屏幕上的内容只是一个视图。根本没有图像控件。在一个油漆盒中绘制整个事物。
  • @DavidHeffernan 可以使用paintbox来拖放图像吗?我需要更多的时间来使用和学习这个控件,但我认为它是用于绘图并且仅限于此,因此我使用的是图像。如果我能在另一个听起来更实用的油漆盒上实现同样的效果。
  • 您必须编写一些拖动代码,但可以做到。每个球体一个控件对我来说似乎都是错误的。
  • @DavidHeffernan 听起来确实效率很低,但我认为唯一的方法是使用图像来移动它们并在鼠标下获取图像,例如在标签或状态栏中显示坐标。感谢您提出替代方法。
  • 最好尽快开始。例如,看看 Andreas 为moving triangles 做了什么。原理很简单,根本没有图形三角形对象。所有这些都由绘制每个触发器OnPaint 事件的数组中的记录表示,并且为了在鼠标下获得一个三角形,您必须为圆圈修改GetTriangleAt 方法。但这也很容易(找到)。

标签: delphi delphi-xe


【解决方案1】:

将 PaintBox 的 Enabled 属性设置为 False。这将使鼠标消息通过。

进一步:

在 PaintBox 的 OnMouseDown 事件中,我在运行时创建图像并将它们添加到滚动框内

将其更改为 ScrollBox 上的 OnMouseDown 事件。通过ScrollBox.[Horz/Vert]Scrollbar.Position调整坐标。

【讨论】:

  • 非常感谢,Enabled 可能会更好地命名,因为我会完全忽略它,直到你提到它,我才从 Delphi 在线帮助中找到信息:Controls whether the control responds to mouse, keyboard, and timer events. 我喜欢这个,因为它也允许我lockpaintbox :)
猜你喜欢
  • 2011-05-05
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
相关资源
最近更新 更多