DELPHI 拖动窗体


我写了一个无边框的窗体.想通过pnlTop实现拖动窗体,与双击时最大化的功能.

最佳的解决方案如下:

procedure TFMain.pnlTopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(FMain.Handle, WM_SYSCOMMAND, $F011, 0);
end;

procedure TFMain.pnlTopDblClick(Sender: TObject);
begin
  self.Top := 0;
  self.Left := 0;
  self.Width := screen.WorkAreaWidth;   //屏幕宽度
  self.Height := screen.WorkAreaHeight; //屏幕高度
end;

ReleaseCapture 函数功能:该函数从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理。捕获鼠标的窗口接收所有的鼠标输入(无论光标的位置在哪里),除非点击鼠标键时,光标热点在另一个线程的窗口中。

WM_COMMAND & WM_SYSCOMMAND参考资料: https://blog.csdn.net/qq_16334327/article/details/81952256

踩过的坑:

我先声明了一个全局

var P:point;

然后:

procedure TFMain.pnlTopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  P.X=X;

  P.Y=Y;
end;

procedure TFMain.pnlTopMouseUp(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
begin

  if shift=[ssLeft] then

  begin

    self.left:=self.left + x - p.x;
    self.top := self.top + y - p.y;

  end;
end;

写到这里,程序还是没问题的.

但是后来想通过双击panel来实现窗体最大化就不行了.按下/弹起事件与双击事件有冲突,怎么都实现不了.最后是大佬指明了道路,感谢大佬!