Pergunta

Eu tenho um aplicativo MDI escrito em Delphi 2006 que roda XP com o tema padrão.

Existe uma maneira de controlar a aparência dos filhos MDI para evitar a grande barra de título estilo XP em cada janela?

Eu tentei definir o BorderStyle do MDIChildren para bsSizeToolWin mas eles ainda são renderizados como Formulários normais.

Foi útil?

Solução

Tudo o que você precisa é sobrecarregar o procedimento CreateWindowHandle, assim:

unit CHILDWIN;
interface
uses Windows, Classes, Graphics, Forms, Controls, StdCtrls;

type
  TMDIChild = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    procedure CreateWindowHandle(const Params: TCreateParams); override;
  end;

implementation

{$R *.dfm}
procedure TMDIChild.CreateWindowHandle(const Params: TCreateParams);
begin
  inherited CreateWindowHandle(Params);
  SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;
end.

Outras dicas

A maneira como o MDI funciona não combina com o que você está tentando fazer.

Se você precisar do formato "MDI", considere usar o formato integrado ou um comercial pacote de encaixe e use a configuração de encaixe para imitar a sensação do MDI.

Em meus aplicativos Delphi, frequentemente uso TFrames e os coloco no formulário principal, maximizando-os para que ocupem a área do cliente.Isso fornece algo semelhante à aparência do Outlook.É mais ou menos assim:

TMyForm = class(TForm)
private
  FCurrentModule : TFrame;
public
  property CurrentModule : TFrame read FModule write SetCurrentModule;
end;

procedure TMyForm.SetCurrentModule(ACurrentModule : TFrame);
begin
  if assigned(FCurrentModule) then
    FreeAndNil(FCurrentModule);  // You could cache this if you wanted
  FCurrentModule := ACurrentModule;
  if assigned(FCurrentModule) then
  begin
    FCurrentModule.Parent := Self;
    FCurrentModule.Align := alClient;
  end;
end;

Para usá-lo, você pode simplesmente fazer o seguinte:

MyForm.CurrentModule := TSomeFrame.Create(nil);

Há um bom argumento de que você deve usar interfaces (criando uma interface IModule ou algo assim) que você usa.Costumo fazer isso, mas é mais complexo do que o necessário explicar o conceito aqui.

HTH

Eu não acho que exista;na minha experiência, o MDI no Delphi é estritamente limitado e controlado por sua implementação na VCL (e talvez também pela API do Windows?).Por exemplo, não tente ocultar um filho MDI (você receberá uma exceção se tentar e terá que passar por alguns obstáculos de API para contornar isso) ou alterar a maneira como o menu principal de um filho MDI é mesclado com o formulário host.

Dadas essas limitações, talvez você deva reconsiderar por que gostaria de ter barras de título especiais em primeiro lugar?Acho que também há boas razões pelas quais esse material MDI é padronizado --- seus usuários podem gostar :)

(PS:bom ver uma pergunta sobre Delphi por aqui!)

Obrigado onnodb

Infelizmente o cliente insiste no MDI e na barra de título menor.

Eu descobri uma maneira de fazer isso: ocultar a barra de título substituindo os CreateParams do Windows e, em seguida, criar minha própria barra de título (painel simples com algum manuseio do mouse para movimentação).Funciona bem o suficiente, então acho que posso executá-lo pelo cliente e ver se funciona ...

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