Delphi无标题窗体拖动与Panel遮挡问题解决方案
Delphi 的无标题窗体移动功能,其实挺实用的,是想做个性化界面的时候。没有标题栏,界面干净多,但也意味着失去了默认的拖动功能。你会想,哎,那怎么移动窗体?嗯,这就要用点小技巧了,靠监听鼠标事件自己搞定。
无标题窗体的拖动,核心在于OnMouseDown
和OnMouseMove
这两个事件。在鼠标按下时记录位置,移动时计算偏移量,再更新窗体位置。逻辑挺简单,但遇到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 样式,可以试试这个思路。记得在设计时考虑一下窗体边界,别让它跑到屏幕外头哦~
评论区