Delphi无标题窗体拖动与Panel遮挡问题解决方案

Delphi 的无标题窗体移动功能,其实挺实用的,是想做个性化界面的时候。没有标题栏,界面干净多,但也意味着失去了默认的拖动功能。你会想,哎,那怎么移动窗体?嗯,这就要用点小技巧了,靠监听鼠标事件自己搞定。

无标题窗体的拖动,核心在于OnMouseDownOnMouseMove这两个事件。在鼠标按下时记录位置,移动时计算偏移量,再更新窗体位置。逻辑挺简单,但遇到Panel覆盖就稍微棘手了——因为Panel会“吃掉”鼠标事件。

办法也不复杂,一种是把Panel.MouseTransparent设成True,让它“透明”,事件就能穿透到窗体上;另一种是直接在Panel.OnMouseDown里手动把事件传回窗体。两种方案都蛮好用,看你需求选吧。

下面这段代码,就是完整实现:无标题窗体拖动 + Panel遮挡问题。简单直接,适合拎过去就用:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  if Button = mbLeft then
  begin
    FMouseCoord := Point(Round(X), Round(Y));
    Self.Cursor := crSize;
  end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); begin if (ssLeft in Shift) and (FMouseCoord.X > 0) and (FMouseCoord.Y > 0) then begin Self.Left := Self.Left + Round(X) - FMouseCoord.X; Self.Top := Self.Top + Round(Y) - FMouseCoord.Y; end; end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin if Button = mbLeft then begin Self.Cursor := crDefault; FMouseCoord := Point(0, 0); end; end;

如果你也在做自定义界面,或者就是不喜欢默认 UI 样式,可以试试这个思路。记得在设计时考虑一下窗体边界,别让它跑到屏幕外头哦~

rar
.rar 预估大小:6个文件
folder
无标题窗体拖动 文件夹
file
Project1.dof 2KB
file
Unit1.dfm 499B
file
Project1.cfg 434B
file
Project1.dpr 188B
file
Unit1.pas 904B
file
Project1.res 876B
rar 文件大小:3.4KB