简单来说,你的移动代码需要执行以下操作:
FDragControl
的变量设置为该控件。此代码位于OnMouseDown
事件处理程序中。FDragControl
不为空,则移动控件。此代码位于OnMouseMove
事件处理程序中。FDragControl
设置为空。基本上就是这些了。主要的细微之处在于你必须还记得鼠标拖动开始时的X、Y值。因此,在你的OnMouseDown
处理程序中,你需要编写以下代码:
FStartMousePos := Point(X, Y);
FStartDragControlPos := Point(FDragControl.Left, FDragControl.Top);
然后在 OnMouseMove
中,您的位置代码会读取:
FDragControl.Left := FStartDragControlPos.X + (X-FStartX);
FDragControl.Top := FStartDragControlPos.Y + (Y-FStartY);
当你开始拖动时,还需要捕获鼠标。
调整大小的代码类似。同样,在OnMouseDown
中,你需要决定是调整大小而不是拖动,但代码仍然涉及处理鼠标按下、移动和松开事件。
至于绘画,当你的事件处理程序更改将影响窗体外观的属性时,你需要强制重新绘制。你可以使用FDragControl
的值来决定是否使用控件的特殊绘图,并指示正在拖动它。调整大小也是如此。
由于你的问题是高层次和概念性的,我没有编写完整的工作实现。具体实现取决于你。
// 我已将此作为答案,因为我刚刚阅读了您的最新更新,这实际上应该作为对原始问题的编辑,但无论如何。
您可以下载Cindy组件包并使用cyResizer组件,它几乎可以完成您需要的所有操作,并且非常可定制。
为了寻找更多答案,我找到了以下文章:
如何在运行时移动和调整控件大小 http://delphi.about.com/library/weekly/aa102505a.htm
如何在运行时添加大小句柄以调整控件大小 http://delphi.about.com/library/weekly/aa110105a.htm
这些文章提供了完成此任务所需的所有信息和源代码示例。
这些文章展示了如何实现和使用 TMover 类。我已经完成了它并且可以正确工作。
我还下载了 TcyComponents 包并使用了 TcyResizer。它是一个功能齐全的表单编辑器,几乎具备 Delphi 表单编辑器所需的一切功能。我推荐使用。它附带源代码,并且与 XE2 版本兼容。
OnPaint
事件中使用表单画布绘制它。 - Sir Rufo