【发布时间】:2019-02-12 17:15:12
【问题描述】:
我已将表单更改为无边框表单,我只是将 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;
我得到了这个方法here
现在边框已经消失了,但是当我的Form失去焦点时,又显示了上/下边框....
我怎样才能避免这种情况?
已解决
我离开边界为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 上的解决方案
我创建了一个repository here
【问题讨论】:
-
所以基本上你想要this?
-
@whosrdaddy 是的,我已经在 C# 中使用 WPF 完成了此操作,但我不知道如何在 Delphi 中应用此逻辑...我在 C# 中做到了,我没有输windows 命令。
-
基本上你做同样的事情(覆盖 createparams 并覆盖 wndproc)...
-
@SertacAkyuz 我试过了,但出现了一个小边框,请再看看我的问题。
-
那是我的观点。
标签: delphi delphi-xe rad-studio