您的位置:首页 > 其它

运行期窗体、可视组件任意移动 调整大小功能实现组件

2010-06-24 17:48 447 查看
很多时候我们需要在运行期随意移动窗体、组件或改变其大小,研究了一下封装成一个组件 欢迎大家指点

代码

{*******************************************************}
{                                                       }
{       UWS Move anywhere                               }
{                                                       }
{       版权所有 (C) 2007 UW Soft                       }
{                                                       }
{*******************************************************}

unit UWSMoveAnyWhere;

interface

uses
SysUtils, Classes,Controls,Messages,Windows,Forms;

const
MAW_HSizeL=$F001;
MAW_HSizeR=$F002;
MAW_VSizeT=$F003;
MAW_SizeLT=$F004;
MAW_SizeRT=$F005;
MAW_VSizeB=$F006;
MAW_SizeLB=$F007;
MAW_SizeRB=$F008;
MAW_MoveAnyWhere=$F009;
MAW_MoveAnyWhereEx=$F011;
MAW_Move=$F012;

type
TMoveType=(mvMove,mvMoveEx,mvMoveA,mvSizeRB,mvSizeLB,mvVSizeB,mvSizeRT,mvSizeLT,mvVSizeT,mvHSizeR,mvHSizeL);
TControlMode=(mFixed,mAuto);
TUWSMoveAnyWhere = class(TComponent)
private
{ Private declarations }
FMoveControl:TWinControl;
FControlForm:TForm ;
FMoveType:TMoveType ;
FActive:Boolean ;
FControlMode:TControlMode ;
protected
{ Protected declarations }
public
{ Public declarations }
procedure DoMoveAnyWhere;
procedure DoFormMoveAnyWhere;
procedure AutoMove(Shift: TShiftState; X, Y, Precision: integer);
procedure AutoMoveForm(Shift: TShiftState; X, Y, Precision: integer);
published
{ Published declarations }
property MoveControl   :   TWinControl read FMoveControl write FMoveControl;
property ControlForm   :   TForm  read FControlForm write FControlForm;
property MoveType      :   TMoveType read FMoveType write FMoveType;
property Active        :   Boolean  read FActive write FActive;
property ControlMode   :   TControlMode read FControlMode  write FControlMode;
end;

procedure Register;

implementation

procedure TUWSMoveAnyWhere.DoMoveAnyWhere ;
var
MoveMode:Word ;
begin
if not FActive then Exit ;
if FControlMode=mAuto then Exit ;
Screen.Cursor:=crDefault ;
case FMoveType of
mvMove:MoveMode:=MAW_Move ;
mvMoveEx:MoveMode:=MAW_MoveAnyWhereEx;
mvMoveA:MoveMode:=MAW_MoveAnyWhere;
mvSizeRB:MoveMode:=MAW_SizeRB;
mvSizeLB:MoveMode:=MAW_SizeLB;
mvVSizeB:MoveMode:=MAW_VSizeB;
mvSizeRT:MoveMode:=MAW_SizeRT;
mvSizeLT:MoveMode:=MAW_SizeLT;
mvVSizeT:MoveMode:=MAW_VSizeT;
mvHSizeR:MoveMode:=MAW_HSizeR;
mvHSizeL:MoveMode:=MAW_HSizeL;
end;
if FMoveControl<>nil then
begin
ReleaseCapture;
FMoveControl.Perform(WM_SYSCOMMAND,MoveMode,0);
end;
FMoveControl.Update ;
end;

procedure TUWSMoveAnyWhere.DoFormMoveAnyWhere;
var
MoveMode:Word ;
begin
if not FActive then Exit ;
if FControlMode=mAuto then Exit ;
Screen.Cursor:=crDefault ;
case FMoveType of
mvMove:MoveMode:=MAW_Move ;
mvMoveEx:MoveMode:=MAW_MoveAnyWhereEx;
mvMoveA:MoveMode:=MAW_MoveAnyWhere;
mvSizeRB:MoveMode:=MAW_SizeRB;
mvSizeLB:MoveMode:=MAW_SizeLB;
mvVSizeB:MoveMode:=MAW_VSizeB;
mvSizeRT:MoveMode:=MAW_SizeRT;
mvSizeLT:MoveMode:=MAW_SizeLT;
mvVSizeT:MoveMode:=MAW_VSizeT;
mvHSizeR:MoveMode:=MAW_HSizeR;
mvHSizeL:MoveMode:=MAW_HSizeL;
end;
if FControlForm<>nil then
begin
ReleaseCapture;
FControlForm.Perform(WM_SYSCOMMAND,MoveMode,0);
end;
//FControlForm.Update ;
end;

procedure TUWSMoveAnyWhere.AutoMove(Shift: TShiftState; X, Y, Precision: Integer);
var
MoveMode:Word ;
begin
if not FActive then Exit ;
if FMoveControl=nil then Exit ;
if FControlMode=mFixed then Exit ;
// 光标在左侧时
if (X<=Precision) and (Y>Precision) and (Y<FMoveControl.Height-Precision) then
begin
MoveMode:=MAW_HSizeL;
Screen.Cursor := crSizeWE;
end
// 光标在右侧时
else if (X>=FMoveControl.Width-Precision) and (Y>Precision) and (Y<FMoveControl.Height-Precision) then
begin
MoveMode:=MAW_HSizeR;
Screen.Cursor := crSizeWE;
end
//光标在顶部时
else if (X>Precision) and (X<FMoveControl.Width-Precision) and (Y<=Precision) then
begin
MoveMode:=MAW_VSizeT;
Screen.Cursor :=crSizeNS;
end
// 光标在左上角
else if (X<=Precision) and (Y<=Precision) then
begin
MoveMode:=MAW_SizeLT;
Screen.Cursor := crSizeNWSE;
end
// 光标在右上角
else if (X>=FMoveControl.Width-Precision) and (Y<=Precision) then
begin
MoveMode:=MAW_SizeRT;
Screen.Cursor := crSizeNESW;
end
//光标在底部
else if (X>Precision) and (X<FMoveControl.Width-Precision) and (Y>=FMoveControl.Height-Precision) then
begin
MoveMode:=MAW_VSizeB;
Screen.Cursor := crSizeNS;
end
//光标在左下角
else if (X<=Precision) and (Y>=FMoveControl.Height-Precision) then
begin
MoveMode:=MAW_SizeLB;
Screen.Cursor :=crSizeNESW;
end
// 光标在右下角
else if (X>=FMoveControl.Width-Precision) and (Y>=FMoveControl.Height-Precision) then
begin
MoveMode:=MAW_SizeRB;
Screen.Cursor := crSizeNWSE;
end
// 移动模式
else if(X>5) and (Y>5) and (X<FMoveControl.Width-5) and (Y<FMoveControl.Height-5) then
begin
MoveMode:=MAW_Move;
Screen.Cursor := crDefault;
end;
if Shift=[ssLeft] then
begin
ReleaseCapture;
FMoveControl.Perform(WM_SYSCOMMAND,MoveMode,0);
end;
FMoveControl.Update ;
end;

procedure TUWSMoveAnyWhere.AutoMoveForm(Shift: TShiftState; X, Y, Precision: Integer);
var
MoveMode:Word ;
begin
if not FActive then Exit ;
if FControlForm=nil then Exit ;
if FControlMode=mFixed then Exit ;
// 光标在左侧时
if (X<=Precision) and (Y>Precision) and (Y<FControlForm.Height-Precision) then
begin
MoveMode:=MAW_HSizeL;
FControlForm.Cursor := crSizeWE;
end
// 光标在右侧时
else if (X>=FControlForm.Width-Precision) and (Y>Precision) and (Y<FControlForm.Height-Precision) then
begin
MoveMode:=MAW_HSizeR;
FControlForm.Cursor := crSizeWE;
end
//光标在顶部时
else if (X>Precision) and (X<FControlForm.Width-Precision) and (Y<=Precision) then
begin
MoveMode:=MAW_VSizeT;
FControlForm.Cursor :=crSizeNS;
end
// 光标在左上角
else if (X<=Precision) and (Y<=Precision) then
begin
MoveMode:=MAW_SizeLT;
FControlForm.Cursor := crSizeNWSE;
end
// 光标在右上角
else if (X>=FControlForm.Width-Precision) and (Y<=Precision) then
begin
MoveMode:=MAW_SizeRT;
FControlForm.Cursor := crSizeNESW;
end
//光标在底部
else if (X>Precision) and (X<FControlForm.Width-Precision) and (Y>=FControlForm.Height-Precision) then
begin
MoveMode:=MAW_VSizeB;
FControlForm.Cursor := crSizeNS;
end
//光标在左下角
else if (X<=Precision) and (Y>=FControlForm.Height-Precision) then
begin
MoveMode:=MAW_SizeLB;
FControlForm.Cursor :=crSizeNESW;
end
// 光标在右下角
else if (X>=FControlForm.Width-Precision) and (Y>=FControlForm.Height-Precision) then
begin
MoveMode:=MAW_SizeRB;
FControlForm.Cursor := crSizeNWSE;
end
// 移动模式
else if(X>5) and (Y>5) and (X<FControlForm.Width-5) and (Y<FControlForm.Height-5) then
begin
MoveMode:=MAW_Move;
FControlForm.Cursor := crDefault;
end;
if Shift=[ssLeft] then
begin
ReleaseCapture;
FControlForm.Perform(WM_SYSCOMMAND,MoveMode,0);
end;
//FControlForm.Update ;
end;

procedure Register;
begin
RegisterComponents('UWS Used', [TUWSMoveAnyWhere]);
end;

end.


下载:http://files.cnblogs.com/uws2056/MoveAnyWhere.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐