怎么实现组件大小和位置的自由拖放呢?

whitetiger8 2003-10-15 07:24:59
如题了。
...全文
37 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
whitetiger8 2003-10-20
  • 打赏
  • 举报
回复
这样啊。多谢了。给分
pankun 2003-10-19
  • 打赏
  • 举报
回复
ReleaseCapture是释放鼠标捕获,
WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);是向WinControl这个控件发消息.用SendMessage(WinControl.Handle, WM_SYSCOMMAND, SC_MANIPULATE, 0)也一样.
$F001,$F002等的消息也是平常看文章知道的哈...
whitetiger8 2003-10-19
  • 打赏
  • 举报
回复

pankun(剑神一笑)太神奇了。不过我看不太懂。请问ReleaseCapture; WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);这两句是什么意思?
您怎么知道$F001,$F002的意思啊?真是学习。我对消息不太熟!
whitetiger8 2003-10-16
  • 打赏
  • 举报
回复
是么,我试试啊。多谢了。
jiyongqiang 2003-10-15
  • 打赏
  • 举报
回复
pankun 真厉害!
pankun 2003-10-15
  • 打赏
  • 举报
回复
转篇贴子你参考一下

//==============================================================================

//任意摆布一个控件(拖动、放大、缩小)******************************************

//==============================================================================

procedure ManipulateControl(WinControl: TWinControl; Shift: TShiftState; X, Y, Precision: integer);//Precision:精度,该方法可以在onmousemove中调用

var SC_MANIPULATE: Word;

begin

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的最左侧**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

if (X<=Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F001;

WinControl.Cursor := crSizeWE;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的最右侧**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>=WinControl.Width-Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F002;

WinControl.Cursor := crSizeWE;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的最上侧**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>Precision) and (X<WinControl.Width-Precision) and (Y<=Precision)

then begin

SC_MANIPULATE := $F003;

WinControl.Cursor := crSizeNS;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的左上角**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X<=Precision) and (Y<=Precision)

then begin

SC_MANIPULATE := $F004;

WinControl.Cursor := crSizeNWSE;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的右上角**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>=WinControl.Width-Precision) and (Y<=Precision)

then begin

SC_MANIPULATE := $F005;

WinControl.Cursor := crSizeNESW ;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的最下侧**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>Precision) and (X<WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F006;

WinControl.Cursor := crSizeNS;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的左下角**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X<=Precision) and (Y>=WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F007;

WinControl.Cursor := crSizeNESW;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的右下角**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>=WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F008;

WinControl.Cursor := crSizeNWSE;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的客户区(移动整个控件)******************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>5) and (Y>5) and (X<WinControl.Width-5) and (Y<WinControl.Height-5)

then begin

SC_MANIPULATE := $F009;

WinControl.Cursor := crSizeAll;

end

else begin

SC_MANIPULATE := $F000;

WinControl.Cursor := crDefault;

end;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

if Shift=[ssLeft] then

begin

ReleaseCapture;

WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);

end;

end;


调用例子:
procedure TForm_Main.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

Caption := IntToStr(X) + '/' + IntToStr(Y);

ManipulateControl((Sender as TWinControl), Shift, X, Y, 10);

end;
47522341 2003-10-15
  • 打赏
  • 举报
回复
up
huojiehai 2003-10-15
  • 打赏
  • 举报
回复
在Google上搜索一下,有个控件放到界面上就可以拖了,很简单的!
http://vbeden.xg88.com/learner/secondary/list/page2.htm#bm3
http://www.ahetc.gov.cn/cit/200011/20.doc

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧