Crie um formulário sem bordas sem perder os comandos do Windows
Alterei meu formulário para um formulário sem borda, apenas alterei oBorderStyle
propriedade parabsNone
, mas agora meu aplicativo perde a âncora do Windows e alguns comandos como
WIN + ↑ (Alinha o formulário Cliente)
WIN + ↓ (Minimize o formulário)
WIN + → (Alinhar o formulário à direita)
WIN + ← (Alinhar o formulário à esquerda)
Eu tentei definirBorderStyle: bsSizeable
e use o código abaixo dentro doFormCreate
, mas isso não funcionou:
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;
Este resultado:
A imagem acima é o que eu quero, mas os comandos do Windows que eu já mencionei não funcionam
Tem alguma maneira de definir oBorderStyle: bsNone
e não perca esses comandos?
EDITAD
Se eu usar oWS_THICKFRAME
meu formulário retorna uma pequena borda superior e os comandos do Windows funcionam bem, mas não quero essa borda superio
EDITED 2
Cheguei muito perto do resultado esperado, mas ainda tenho um pequeno problema ...
Coloquei isso no meuFormCreate
SetWindowLong(Handle
,GWL_STYLE
,GetWindowLong(Handle, GWL_STYLE)
AND (NOT WS_CAPTION)
);
E eu crio o método
private
procedure WmNCCalcSize(var Msg: TWMNCCalcSize); message WM_NCCALCSIZE;
e depoi
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;
Eu tenho esse métodoAqu
Agora a borda desapareceu, mas quando meu Form perde o foco, a borda superior / inferior é mostrada novamente ....
Como posso evitar isso
RESOLVIDO
Eu deixei a fronteira comoBorderStyle: bsSizeable
, então eu fiz:
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;
Solução no GitHUB
Eu criei umrepository here