简单地说你的移动代码需要这样做:
- 当鼠标向下时,检查鼠标位置是否在可以拖动的控件上。如果是这样,则设置一个名为的变量
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
来决定是否使用您的控件的特殊绘图并指示它正在被拖动。同样用于调整大小。
我没有编写完整的工作实现,因为您的问题是高级别的和概念性的。实施取决于您。