首页  编辑  

任意的拖动窗口和控件

Tags: /超级猛料/VCL/Form,窗体/FAQ/   Date Created:

任意的拖动窗口

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;

10为精度