【发布时间】:2013-09-27 17:29:32
【问题描述】:
我正在尝试创建一个有趣的基本地图编辑器,它由滚动框和绘画框组成(用于绘制网格)。
在油漆盒的 OnMouseDown 事件中,我在运行时创建图像并将它们添加到滚动框内,网格油漆盒被绘制在图像上方(因为如果网格位于后面,它看起来就不好看)。
这是一个示例屏幕:
我的问题将解决我的两个问题。
- 我需要能够在运行时拖放(移动)图像。
- 我还需要能够获取图像的 X 和 Y 位置以显示为信息。
这就是我的问题所在,要解决上述问题,我首先需要获取鼠标光标下的图像。但是因为我在图像上方绘制了我的网格(画框),所以光标只会“看到”画框网格,而不是底层图像。
我确实尝试将彩绘箱网格复制到 TImage,但结果完全错误,并且出现内存不足错误。地图的大小可能非常大,因此由于内存和限制等原因,将网格放到位图上并不理想。
网格必须在顶部,否则看起来像这样:
这隐藏了网格,我不希望这种情况发生。
那么,我如何使用 FindVCLWindow 或类似的东西看过去画框并到达下面的图像?
【问题讨论】:
-
我想我会避免将地图存储在 GUI 控件中。将其存储在专用的数据结构中,并使屏幕上的内容只是一个视图。根本没有图像控件。在一个油漆盒中绘制整个事物。
-
@DavidHeffernan 可以使用paintbox来拖放图像吗?我需要更多的时间来使用和学习这个控件,但我认为它是用于绘图并且仅限于此,因此我使用的是图像。如果我能在另一个听起来更实用的油漆盒上实现同样的效果。
-
您必须编写一些拖动代码,但可以做到。每个球体一个控件对我来说似乎都是错误的。
-
@DavidHeffernan 听起来确实效率很低,但我认为唯一的方法是使用图像来移动它们并在鼠标下获取图像,例如在标签或状态栏中显示坐标。感谢您提出替代方法。
-
最好尽快开始。例如,看看 Andreas 为
moving triangles做了什么。原理很简单,根本没有图形三角形对象。所有这些都由绘制每个触发器OnPaint事件的数组中的记录表示,并且为了在鼠标下获得一个三角形,您必须为圆圈修改GetTriangleAt方法。但这也很容易(找到)。