C
crazycock
Unregistered / Unconfirmed
GUEST, unregistred user!
往Panel上面丢个控件(OLEContainer),如果没有加载ocx的时候,可以用下面的代码进行拖动。
OldPosition:TPoint; //目标原始位置
PY:TPoint; //鼠标按下和目标位置的偏移量
bDragMode:Boolean; //True为鼠标按下,False为鼠标松开
procedure TForm1.OleContainer1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
bDragMode:=True;
//保存偏移量,这里的X,Y是以TextTool组件的原点作为参考的,所以直接就是偏移量
PY.X:=X;
PY.Y:=Y;
//
OldPosition:=Point(TOleContainer(Sender).Left,TOleContainer(Sender).Top);
end;
procedure TForm1.OleContainer1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if bDragMode=False then
Exit;
//这里的X,Y是移动的距离,例如右移100象素,X就是100。
TOleContainer(Sender).Left:=OldPosition.X+X-PY.X;
TOleContainer(Sender).Top:=OldPosition.Y+Y-PY.Y;
OldPosition:=Point(TOleContainer(Sender).Left,TOleContainer(Sender).Top);
end;
procedure TForm1.OleContainer1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
bDragMode:=False;
end;
但是,一旦OLEContainer加载了内容后,就没法接收到我鼠标的信息了。因为我设置OleContainer的SizeMode是smAutoSize,只有1个象素的边框可以让我点,而且没法方便拖动。
谁有好一点的解决方案?我的想法是:
(1)捕捉鼠标的移动,如果处于某个OleContainer内,显示一个同样大小的漂浮Panel在正上方供我拖动,OleContainer的位置和Panel同步。
(2)好像OleContainer中的内容以Icon方式显示的时候,可以获得鼠标输入,可以拖动。但是我的ActiveForm不知道如何支持这种方式的显示。要做什么额外代码么?
OldPosition:TPoint; //目标原始位置
PY:TPoint; //鼠标按下和目标位置的偏移量
bDragMode:Boolean; //True为鼠标按下,False为鼠标松开
procedure TForm1.OleContainer1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
bDragMode:=True;
//保存偏移量,这里的X,Y是以TextTool组件的原点作为参考的,所以直接就是偏移量
PY.X:=X;
PY.Y:=Y;
//
OldPosition:=Point(TOleContainer(Sender).Left,TOleContainer(Sender).Top);
end;
procedure TForm1.OleContainer1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if bDragMode=False then
Exit;
//这里的X,Y是移动的距离,例如右移100象素,X就是100。
TOleContainer(Sender).Left:=OldPosition.X+X-PY.X;
TOleContainer(Sender).Top:=OldPosition.Y+Y-PY.Y;
OldPosition:=Point(TOleContainer(Sender).Left,TOleContainer(Sender).Top);
end;
procedure TForm1.OleContainer1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
bDragMode:=False;
end;
但是,一旦OLEContainer加载了内容后,就没法接收到我鼠标的信息了。因为我设置OleContainer的SizeMode是smAutoSize,只有1个象素的边框可以让我点,而且没法方便拖动。
谁有好一点的解决方案?我的想法是:
(1)捕捉鼠标的移动,如果处于某个OleContainer内,显示一个同样大小的漂浮Panel在正上方供我拖动,OleContainer的位置和Panel同步。
(2)好像OleContainer中的内容以Icon方式显示的时候,可以获得鼠标输入,可以拖动。但是我的ActiveForm不知道如何支持这种方式的显示。要做什么额外代码么?