Portabilidade de aplicações Delphi em lt;gt; versões do Wi
:?:
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 ?
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
Curtidas 0
Respostas
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
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.
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
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
27/12/2003
tá sim, eu uso Win98 SE e a função funciona perfeitamente.
GOSTEI 0
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...
To muito podre pra esse tipo de coisa últimamente, só fiz por fazer mesmo, mas se vc puder resolver, legal :D ...
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
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
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...
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