Portabilidade de aplicações Delphi em lt;gt; versões do Wi

Delphi

27/12/2003

:?:

Estou num dilema.

Estou desenvolvendo uma aplicação em Delphi 7 em Windows XP. A aplicação contém imagens de fundo em seus formulários e alguns efeitos de formulário que a versão 7 do Delphi traz, por exemplo, a propriedade que faz o formulário ficar transparente (AlphaBlend).

Fiz um SplashScreen legal utilizando dessas novas propriedades do Delphi, neste caso coloquei uma figura no fundo do formulário e deixei o Form transparente de modo que quando carrego o formulário só aparece a figura de fundo recortada. Perfeito.

Quando tento executar a aplicação sob o Windows 98 por exemplo, fica tudo horrível, o Form do SplashScreen já não fica mais transparente e as figuras do fundo do form ficam todas chaviscadas (mesmo utilizando a mesma resolução de 1024 x 768 em 32 bits).

Gostaria de saber como proceder neste caso, pois gostaria que minha aplicação funcionasse da mesma forma em qualquer versão anterior a do Windows XP com os mesmos recursos gráficos e de animação que projetei até agora.

Será preciso levar alguma DLL do Windows Xp para o Windows 98 ?

Se eu tentar compilar a aplicação sob o Windows 98 as propriedades do Delphi 7 não fazem o mesmo efeito.

Alguém sabe de uma solução para esse problema, ou pelo menos me explicar detalhadamente por que isso ocorre ?


Henryabm

Henryabm

Curtidas 0

Respostas

Beppe

Beppe

27/12/2003

Transparências em forms são recursos apenas do Windows 2000 e XP, então em outras versões você tem que se contentar com o que o sistema oferece.


GOSTEI 0
Cebikyn

Cebikyn

27/12/2003

Não é bem assim, não precisa necessariamente se contentar com o que o sistema oferece, pode-se usar a função AlphaBlend da unit Windows e combinar a figura com o Desktop e desenhar o resultado no canvas do form.

Para usar a função AlphaBlend é necessário usar Windows na frente:
Windows.AlphaBlend, senão o Delphi confundirá com a propriedade do formulário.


GOSTEI 0
Beppe

Beppe

27/12/2003

Se eu não me engano, a dll msimg32(que tem a função AlphaBlend, GradientFill e TransparentBlt), não está disponível no Win98.


GOSTEI 0
Cebikyn

Cebikyn

27/12/2003

tá sim, eu uso Win98 SE e a função funciona perfeitamente.


GOSTEI 0
Beppe

Beppe

27/12/2003

Pior que é mesmo. Minha memória me passou pra trás. :cry:

Mas você já conseguiu fazer isso? Eu tentei, mas tem vários problemas:

1) Ao chamar GetDC(GetDesktopWindow), esse DC já tem o form desenhado. E se eu chamar Hide; Show no form, ele fica piscando na tela...
2) Tb não consegui fazer o AlphaBlend funcionar...

var
  InheritedImage: Boolean;

procedure TForm1.FormPaint(Sender: TObject);
var
  DesktopDC: HDC;
  BlendData: TBlendFunction;
  Back: TBitmap;
  Org: TPoint;
begin
  if InheritedImage then Exit;
  InheritedImage := True;
  Org := GetClientOrigin;
  DesktopDC := GetDC(GetDesktopWindow);
  try
    BitBlt(Canvas.Handle, 0, 0, ClientWidth, ClientHeight, DesktopDC,
      Org.X, Org.Y, SRCCOPY);
  finally
    ReleaseDC(GetDesktopWindow, DesktopDC);
  end;
  BlendData.BlendOp := AC_SRC_OVER;
  BlendData.BlendFlags := 0;
  BlendData.SourceConstantAlpha := 80;
  BlendData.AlphaFormat := AC_SRC_ALPHA;
  Back := GetFormImage;
  try
    Windows.AlphaBlend(Canvas.Handle, 0, 0, ClientWidth, ClientHeight,
      Back.Canvas.Handle, Org.X, Org.Y, Org.X + ClientWidth, Org.Y + ClientHeight,
      BlendData);
  finally
    Back.Free;
  end;
end;


To muito podre pra esse tipo de coisa últimamente, só fiz por fazer mesmo, mas se vc puder resolver, legal :D ...


GOSTEI 0
Cebikyn

Cebikyn

27/12/2003

Eu nunca fiz isso (mas já usei o AlphaBlend sem problemas), mas se eu fizesse, eu colocaria o GetDC antes do form ser criado (logo depois de Application.Initialize) e colocaria a imagem do Desktop em um Bitmap, direto no DPR (isso é possível pois no caso citado trata-se de um Splash Screen), e ainda colocaria um delay (sleep(100)) antes de liberar a criação dos forms. E depois do form ser criado, ainda no DPR, o Bitmap seria desenhado nele. Acho que assim funciona.


GOSTEI 0
Beppe

Beppe

27/12/2003

É, mas para uso geral seria díficil achar uma solução, e também não vejo futuro gastar tempo com efeito visual que só deixa a máquina mais lenta.

No meu código, esqueci de reinicializar a variável InheritedImage. Ela é usada para que evitar recursão em TForm.OnPaint. GetFormImage dispara este evento também. Então deveria ter um InheritedImage := False no final do método FormPaint. De qualquer forma não é isso que faria funcionar...


GOSTEI 0
POSTAR