如何拖动没有标题栏的窗体??

解决方案 »

  1.   

    procedure WMNCHITTEST(var msg: TWMNCHITTEST); message WM_NCHITTEST;
    procedure TForm1.WMNCHITTEST(var msg: TWMNCHITTEST);
    var
      pt: TPoint;
    begin
      pt := ScreenToClient(Point(msg.XPos,msg.YPos));
      if(pt.y<24) then msg.Result := HTCAPTION
      else msg.Result := HTCLIENT;
    end;
      

  2.   

    在Form1的“Private”部分声明过程:
    在private部分加入下列代码:
    procedure wmnchittest(var msg:twmnchittest);
    message wm_nchittest;
    在程序部分加入以下代码:
    procedure TForm1.wmnchittest(var msg:twmnchittest);
    begin
    inherited;
    if (htclient=msg.result) then msg.result:=htcaption;
    end;
      

  3.   

    在private部分加入下列代码:
    procedure wmnchittest(var msg:twmnchittest);
    message wm_nchittest;
    在程序部分加入以下代码:
    procedure TForm1.wmnchittest(var msg:twmnchittest);
    begin
    inherited;
    if (htclient=msg.result) then msg.result:=htcaption;
    end;
    上面的关键代码虽然只有两行,但它实现了鼠标直接拖动窗体的目的。代码的原理是利用窗体的WM_NCHITTEST消息,这个消息是当光标移动、鼠标按下或释放时发生的,当程序检测到鼠标在窗体中按下的消息后(消息的值为htClient),将鼠标在标题栏上按下时产生的消息(值为htCaption)传递出去,这样就巧妙的欺骗程序认为是标题栏被按下,当然就可拖动窗体了。祝:身体健康,答案和分数同样重要:)
      

  4.   

    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  
      Shift: TShiftState; X, Y: Integer);  
    begin  
      ReleaseCapture;  
      SendMessage(Handle, WM_SYSCOMMAND, $F012, 0);  
    end