运行期窗体、可视组件任意移动 调整大小功能实现组件
2010-06-24 17:48
447 查看
很多时候我们需要在运行期随意移动窗体、组件或改变其大小,研究了一下封装成一个组件 欢迎大家指点
代码
下载:http://files.cnblogs.com/uws2056/MoveAnyWhere.rar
代码
{*******************************************************} { } { 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
相关文章推荐
- C#之移动无标题栏窗体功能的实现!...
- 下压栈-能够自动调整数组大小实现并实现迭代功能
- Reader开发(一)电子书分页,翻页效果,字体大小调整和基本功能实现
- Reader开发(一)电子书分页,翻页效果,字体大小调整和基本功能实现
- C# 无边框窗体的移动,任务栏右键菜单,调整大小
- C# 无边框窗体的移动,任务栏右键菜单,调整大小
- Android实现让图片在屏幕上任意移动的方法(拖拽功能)
- 基于mfc的对话框编程中,实现控件随对话框大小自动缩放以及通过滚动条实现控件移动功能
- Reader开发(一)电子书分页,翻页效果,字体大小调整和基本功能实现
- WPF无边框窗体-可移动可调整大小
- JavaScript实现浏览器本地的图像移动、大小调整和裁剪
- MFC中CListCtrl单击表头排序+表格大小随窗体大小改变等功能实现
- 实现窗体的移动功能
- VirtuaBox的安装功能增强,可以实现主机与虚拟机之间的互相拷贝以及虚拟机的任意大小
- Reader开发(一)电子书分页,翻页效果,字体大小调整和基本功能实现
- C#之移动无标题栏窗体功能的实现!...
- Reader开发(一)电子书分页,翻页效果,字体大小调整和基本功能实现
- Android基于widget组件实现物体移动/控件拖动功能示例
- windows 10 build 9926开始菜单如何实现可调整大小功能?
- C# 使用WM_NCLBUTTONDOWN消息实现任意位置移动窗体