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: sem barra de fita
(fonte: xrw.bc.ca )

com barra de fita: com barra de fita
(fonte: xrw.bc.ca )

i já ilustrou esta com algum desenho 2, 4 e 8 pixels a partir da borda.

não é maximizada
(fonte: xrw.bc.ca )
maximizada
(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!

Foi útil?

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.

imagem da fita esquerda final

imagem da extremidade direita fita

imagem da barra de status

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top