フォームをボーダレス フォームに変更しました。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 でのソリューション
ここにリポジトリを作成しました