我已将表单更改为无边框表单,我只是将BorderStyle
属性更改为bsNone
,但现在我的应用程序丢失了 windows 锚点和一些命令,例如
WIN + ↑ (对齐客户端)
WIN + ↓ (最小化表单)
WIN + →(对齐表单右)
WIN + ←(对齐表单左)
我尝试在 中设置BorderStyle: bsSizeable
和使用以下代码FormCreate
,但这不起作用:
procedure TfrmBase.FormCreate(Sender: TObject);
begin
SetWindowLong(Handle
,GWL_STYLE
,GetWindowLong(Handle, GWL_STYLE)
AND (NOT WS_CAPTION)
AND (NOT WS_THICKFRAME)
);
Refresh;
FormColor := oLauncher.oCor;
end;
结果:
上图是我想要的,但是我已经提到的 Windows 命令不起作用
有什么方法可以设置BorderStyle: bsNone
并且不会丢失这些命令?
已编辑
如果我使用WS_THICKFRAME
我的表单返回一个小的顶部边框并且 windows 命令运行良好,但我不想要那个顶部边框。
已编辑 2
我非常接近预期的结果,但还有一点问题......
我把这个放在我的FormCreate
SetWindowLong(Handle
,GWL_STYLE
,GetWindowLong(Handle, GWL_STYLE)
AND (NOT WS_CAPTION)
);
我创建了方法
private
procedure WmNCCalcSize(var Msg: TWMNCCalcSize); message WM_NCCALCSIZE;
接着
procedure TfrmBase.WmNCCalcSize(var Msg: TWMNCCalcSize);
begin
inherited;
if Msg.CalcValidRects then
begin
InflateRect(Msg.CalcSize_Params.rgrc[0], 0, 6);
Msg.Result := 0;
end;
end;
现在边框已经消失了,但是当我的表单失去焦点时,顶部/底部边框再次显示......
我怎样才能避免这种情况?
解决了
我离开了边界BorderStyle: bsSizeable
,然后我做到了:
private
procedure WmNCCalcSize(var Msg: TWMNCCalcSize); message WM_NCCALCSIZE;
[...]
procedure TfrmBase.WmNCCalcSize(var Msg: TWMNCCalcSize);
var
R: TRect;
begin
if not Msg.CalcValidRects then
R := PRect(Msg.CalcSize_Params)^;
inherited;
if Msg.CalcValidRects then
Msg.CalcSize_Params.rgrc0 := Msg.CalcSize_Params.rgrc1
else
PRect(Msg.CalcSize_Params)^ := R;
Msg.Result := 0;
end;
procedure TfrmBase.FormCreate(Sender: TObject);
begin
BorderStyle := bsNone;
SetWindowLong(Handle
,GWL_STYLE
,WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW
);
end;
procedure TfrmBase.FormShow(Sender: TObject);
begin
Width := (Width - 1);
end;
GitHub 上的解决方案