Como centralizar a janela MDI filha na janela MDI pai?
Do fórum do ClubeDelphi:
Quando crio um projeto MDI, e consequentemente os forms MDI filhos, em geral coloco a propriedade Position = poMainFormCenter. Porém, ao abrir o form filho nunca ele aparece posicionado exatamente no centro do form principal. Sempre aparece posicionado um pouco para baixo do centro. Já tentei colocar a propriedade Position em todas as outras opções de "center", mas sempre o form abre decentralizado. Quando os forms são pequenos não tem problema, mas quando ocupam a maior parte da dimensão vertical da tela, eles aparecem cortado embaixo. Ou melhor, uma faixa da parte de baixo fica escondida.
Esse problema ocorre porque o Delphi irá centrar a janela MDI filha na área cliente da janela pai, que não coincide com a área cliente MDI da janela pai. A área cliente é toda área da janela exceto o título e as bordas enquanto a área cliente MDI é a área utilizada pelas janelas MDI filhas.
O código seguinte centra a janela filha na janela pai:
1 type 2 TFormFilho = class(TForm) 3 public 4 procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; 5 end; 6 7 ... 8 9 procedure TFormFilho.SetBounds(ALeft, ATop, AWidth, 10 AHeight: Integer); 11 var 12 MainForm: TForm; 13 Rect: TRect; 14 Origem: TPoint; 15 begin 16 if Showing then begin 17 18 MainForm := Application.MainForm; 19 20 // Obtem o retângulo da área cliente MDI 21 Windows.GetWindowRect(MainForm.ClientHandle, Rect); 22 23 // Calcula a origem da área cliente MDI no form 24 Origem := Rect.TopLeft; 25 Dec(Origem.x, MainForm.Left); 26 Dec(Origem.y, MainForm.Top); 27 28 // Calcula nossa nova posição 29 ALeft := (MainForm.Width - Width) div 2 - Origem.x; 30 ATop := (MainForm.Height - Height) div 2 - Origem.y; 31 end; 32 33 inherited SetBounds(ALeft, ATop, AWidth, AHeight); 34 end;
O código seguinte centra a janela filha na área cliente MDI da janela pai:
1 type 2 TFormFilho = class(TForm) 3 public 4 procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; 5 end; 6 7 ... 8 9 procedure TFormFilho.SetBounds(ALeft, ATop, AWidth, 10 AHeight: Integer); 11 var 12 MainForm: TForm; 13 Rect: TRect; 14 OurWidth: Integer; 15 OurHeight: Integer; 16 begin 17 if Showing then begin 18 19 MainForm := Application.MainForm; 20 21 // Obtem o retângulo da área cliente MDI 22 Windows.GetWindowRect(MainForm.ClientHandle, Rect); 23 24 // Calcular largura e altura da área cliente 25 OurWidth := Rect.Right - Rect.Left; 26 OurHeight := Rect.Bottom - Rect.Top; 27 28 // Calcula a nova posição 29 ALeft := (OurWidth - Width) div 2; 30 ATop := (OurHeight - Height) div 2; 31 end; 32 33 inherited SetBounds(ALeft, ATop, AWidth, AHeight); 34 end;
Um comentário:
Windows.GetWindowRect(MainForm.ClientHandle, Rect);
Foi bastante útil aqui =) obrigado
Postar um comentário