bug controle da fita? (Provoca corte na vista)
-
08-07-2019 - |
Pergunta
Descobri que quando eu tomar uma forma simples, contendo apenas uma barra de fita e uma barra de status, é de corte. O controle que você vê acima da barra de status foi removido mais tarde. O mesmo corte ocorre qualquer que seja o controlo passa a estar presente. Mais tarde eu removi a barra de status e colocar um controle memo lá em vez com o mesmo resultado.
sem barra de fita:
(fonte: xrw.bc.ca )
com barra de fita:
(fonte: xrw.bc.ca )
i já ilustrou esta com algum desenho 2, 4 e 8 pixels a partir da borda.
(fonte: xrw.bc.ca )
(fonte: xrw.bc.ca )
como Chris Lively diz abaixo, houve claramente um erro de cálculo dos tamanhos. como posso corrigir isso?
Obrigado por seus comentários!
Solução
Eu mal o problema com a minha resposta anterior.
Há uma solução para este problema erro de cálculo que eu fui capaz de chegar a (rapidamente).
Você pode usar um MessageHandler personalizado para WM_SYSCOMMAND com o parâmetro SC_MAXIMIZE wParam. Você pode, em seguida, redimensionar o formulário usando o seguinte:
type
TForm1 = class(TForm)
// other stuff
procedure WMSyscommand(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;
procedure TForm1.WMSysCommand(var Msg: TWMSYSCOMMAND);
var
R: TRect;
begin
// Test for SC_MAXIMIZE. If found...
if Msg.CmdType = SC_MAXIMIZE then
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
Top := R.Top;
Left := R.Left;
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
Msg.Result := 0; // Message handled
end
else
DefaultHandler(Msg);
end;
O código acima (testado em Vista 32-bit Home Premium com Aero / Vidro ativado) multa funciona.
Outras dicas
A solução proposta por Ken White tem alguns problemas:
- estadias botão Maximizar ativa, pode usar alças de redimensionamento de janela maximizada
- Não é possível restaurar a janela volta ao tamanho anterior.
Assim, proponho a seguinte:
// add to form object
procedure WMGetMinMaxInfo(var mmInfo : TWMGETMINMAXINFO); message WM_GETMINMAXINFO;
// implementation
procedure TfrmMain.WMGetMinMaxInfo(var mmInfo: TWMGETMINMAXINFO);
var
R: TRect;
begin
with mmInfo.MinMaxInfo^ do
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
ptMaxPosition.X := R.Left;
ptMaxPosition.Y := R.Top;
ptMaxSize.X := R.Right - R.Left;
ptMaxSize.Y := R.Bottom - R.Top-1;
end;
end;
Não é o ideal, como eu tenho que (por alguma razão) ajustar o maxHeight por -1 para que o manipulador padrão para não re-afirmar-se e mover a janela para -8, -8, ... Mas funciona para mim.