任意的拖动窗口

任意的拖动窗口


procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);


begin


ReleaseCapture;


Perform(WM_SYSCOMMAND,$f012,0);


end;


实际上,可以封装一下上面的代码,这样以后只要在控件的MouseMown中调用下面的函数就可以实现运行的时候拖动和改变控件的大小:


procedure DragControl(WinControl:TWinControl);


const


SM=$F012;


begin


ReleaseCapture;


WinControl.Perform(WM_SYSCOMMAND,SM,0);


end;


其中,$F012可以从$F000变换到$F012,其含义分别如下:


$F000:哎,自己测试吧!


*********************************


<<Delphi 淡手辑略之控件篇>>闪亮登场,掌声.....


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


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


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


procedure ManipulateControl(Control: TControl; Shift: TShiftState; X, Y, Precision: integer);


var SC_MANIPULATE: Word;


begin


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


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


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


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


then begin


SC_MANIPULATE := $F001;


Control.Cursor := crSizeWE;


end


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


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


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


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


then begin


SC_MANIPULATE := $F002;


Control.Cursor := crSizeWE;


end


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


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


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


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


then begin


SC_MANIPULATE := $F003;


Control.Cursor := crSizeNS;


end


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


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


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


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


then begin


SC_MANIPULATE := $F004;


Control.Cursor := crSizeNWSE;


end


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


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


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


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


then begin


SC_MANIPULATE := $F005;


Control.Cursor := crSizeNESW ;


end


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


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


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


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


then begin


SC_MANIPULATE := $F006;


Control.Cursor := crSizeNS;


end


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


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


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


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


then begin


SC_MANIPULATE := $F007;


Control.Cursor := crSizeNESW;


end


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


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


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


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


then begin


SC_MANIPULATE := $F008;


Control.Cursor := crSizeNWSE;


end


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


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


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


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


then begin


SC_MANIPULATE := $F009;


Control.Cursor := crSizeAll;


end


else begin


SC_MANIPULATE := $F000;


Control.Cursor := crDefault;


end;


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


if Shift=[ssLeft] then


begin


ReleaseCapture;


Control.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);


end;


end;


 


 


example:


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


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


begin


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


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


end; 阅读全文
类别: 编程相关-  查看评论

转载于:https://www.cnblogs.com/RoyGo/archive/2009/08/26/1906996.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值