如题,鼠标拖动窗体,改变位子?请粘贴代码

解决方案 »

  1.   

    ...
      TForm1 = class(TForm)
      ...
      private
        procedure drag(var M:twmnchittest);
        message wm_nchittest;
        { Private declarations }
      public
        { Public declarations }
      end;procedure tform1.drag(var M:twmnchittest);
    begin
      inherited;
      if m.Result=htclient then
        m.result :=htcaption;
    end;
      

  2.   

    到网上找了一篇:无标题栏窗口程序设计中鼠标拖动技巧 
    2000-07-04 00:00:00· -·---------------------------------------------------------------------------------
    p>----WINDOWS中窗口的常规移动方法,是用鼠标拖动标题栏来完成,但目前的WINDOWS 程序中,存在很多的无标题栏窗口,这在多媒体流行的时代更是如此,形形色色的媒体播放机大都如此,还有输入法或者即时翻译等程序,其界面只有窄窄的一行, 这样的程序在程序设计阶段必须进行特殊的处理,才能使之具有鼠标拖动功能,本人在DELPHI及VB程序设计中,找到了一种无标题栏窗口鼠标拖动的简单方法, 可广泛应用在类似的程序设计之中。 
    ----基本原理:当无标题栏窗口进行鼠标拖动时,在一个最明显的事实,就是其鼠标在窗口中的坐标始终不变, 所以如果能够在鼠标移动过程中,通过改变窗口在桌面上的坐标,而始终保持鼠标的相对坐标不变,即可实现鼠标的拖动效果;在具体的程序设计中,先在Mousedown() 事件中记录鼠标位置,而在Mousemove()事件中根据鼠标的移动距离,实时修改窗体Form的Top及Left值,即可准确无误的实现窗口的鼠标拖动操作。利用此方法实现鼠标拖动, 与常规的标题栏鼠标拖动在效果上有一点区别,因为标题栏拖动时,鼠标移动过程中不重画窗口,只有松开鼠标后在固定位置重画窗口,所以其速度较快,而采用此方法拖动过程中, 每移动一步都需要重画窗口,对速度稍有影响,在慢一些的机器上会出现轻微的拖尾现象,但绝不会影响正常操作,而在586以上机器上或者高速显示系统下会完全克服这种现象。在实际程序设计时,窗口中可能有多种控件,若想使鼠标拖动窗口中的任何位置都可实现窗口移动, 必须对窗口中的所有控件进行上述的鼠标位置记录与移动处理,即在MouseDown()与MouseMove()事件中加入下面的程序代码,当然与可以在窗口内设置一个专门用于窗口拖动的区域,这样只对此一个控件操作即可。 ----演示程序的编制:下面是一个利用DELPHI编制的时间显示程序,编制方法:在窗体内放置一个按钮Button1及一个时间控件Time1,使按钮呈横向矩形,其WIDTH足以显示下日期和时间, 之后在相应的事件中输入以下程序中的代码,程序运行之后,其界面将只有按钮大小的窄窄一条,显示当前的日期和时间,用鼠标拖动窗口的任一部位,都可使窗口随之准确地移动, 在窗体内按下鼠标右键退出程序。 ----以上方法及程序在WINDOWS95系统下、DELPHI2.0环境调试通过,经在VB5.0环境下试验, 其效果与此一致。 ----附.PAS全部程序代码: unitformyd;
    interface   es
    Windows,Messages,SysUtils,Classes,Graphics,
    Controls,Forms,Dialogs,StdCtrls,ExtCtrls;
    type
    TForm1=class(TForm)
    Timer1:TTimer;
    Button1:TButton;
    procedureFormCreate(Sender:TObject);
    procedureTimer1Timer(Sender:TObject);
    procedureButton1MouseDown(Sender:
    TObject;Button:TMouseButton;
    Shift:TShiftState;X,Y:Integer);
    procedureButton1MouseMove(Sender:
    TObject;Shift:TShiftState;X,
    Y:Integer);
    procedureButton1Click(Sender:TObject);
    private{Privatedeclarations}
    public{Publicdeclarations}
    end;
    //定义全程变量
    var
    Form1:TForm1;
    dx,dy:integer;
    implementation{$R*.DFM}
    //程序初始化
    procedureTForm1.FormCreate(Sender:TObject);
    begin
    form1.borderstyle:=bsnone;
    form1.height:=button1.height;
    form1.width:=button1.width;
    button1.top:=0;
    button1.left:=0;
    end;
    //实时显示当前时间
    procedureTForm1.Timer1Timer(Sender:TObject);
    var
    ds,ts,ps:string;
    begin
    ds:=DATE:+DateToStr(Date);
    ts:=TIME:+timeToStr(time);
    ps:=|__welcome__|;
    button1.Caption:=ds+ps+ts;
    end;
    //记录鼠标当前位置
    procedureTForm1.Button1MouseDown(Sender:
    TObject;Button:TMouseButton;
    Shift:TShiftState;X,Y:Integer);
    begin
    dx:=X;
    dy:=y;
    IfShift=[ssright]Then
    close;//右键单击退出程序
    end;
    //根据鼠标移动距离调整窗口位置
    procedureTForm1.Button1MouseMove(Sender:
    TObject;Shift:TShiftState;X,
    Y:Integer);
    var
    mx,my:integer;
    begin
    IfShift=[ssleft]Then
    begin
    mx:=X-dx;
    my:=Y-dy;
    Form1.Left:=Form1.Left+mx;
    Form1.Top:=Form1.Top+my;
    Form1.Caption:=intToStr(X)+:+intToStr(Y);
    end;
    end;
    end.
      

  3.   

    选择任意一个带有OnMouseMove事件控件,加入如下代码:
      ReleaseCapture;
      Perform(WM_SYSCOMMAND,$f012,0);比如用Label1作为移动控件:procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      ReleaseCapture;
      Perform(WM_SYSCOMMAND,$f012,0);end;-----------------------------------------------------------------
    我是中国鹰派!
    拒绝日货!打倒小日本!