Aplicativo Delphi MDI e a barra de título do MDI Children
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.
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 ...