Alpha blending 2.díl - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Alpha blending 2.díl

alpha_blending2

10. srpna 2001, 00.00 | Chcete si před spuštěním vaší aplikace zobrazit SplashScreen s Alpha průhledností ? Po přečtení tohoto článku to jistě nebude žádný problém !

...spustíte program, první se postupně objeví splash screen a po krátké pauze i hlavní okno... Že to není váš program ? Může být, vždyť na tom nic není, přesvědčte se o tom v dnešním článku !

Vzledem k úspěšnosti minulého článku o Alpha Blendingu se vám nyní do rukou dostalo jeho druhé pokračování. Dozvíte se v něm, jak na alpha blending přes windows funkce, které jsou o poznání rychlejší než naše procedura z minulého článku. Díky rychlosti si tak můžete třeba před startem samotné aplikace postupně zobrazit splash screen. Dost ale povídání, dáme se do práce.

Největší problém funkce, s kterou budeme kreslit je ten, že není v nápovědě. Jedná se o windows funkci AlphaBlend. Její parametry jsou následující:
  • DC - Handle prvního canvasu
  • p2, p3, p4, p5 - souřadnice prvního obrázku
  • DC6 - Handle druhého canvasu
  • p7, p8, p9, p10 - souřadnice druhého obrázku
  • p11 - blend funkce

Prvních pár parametrů je snad jasných, problémy nastanou až u posledního. Musíme si nejprve definovat funkci, například udtBlender typu TBlendFunction, které přiřadíme jednotlivé parametry, a potom ji použijeme ve funkci AlphaBlend. Zde jsou vlastnosti, které musíme definovat pro správné zobrazení:


     with udtBlender do
     begin
          BlendOp := AC_SRC_OVER;
          BlendFlags := 0;
          SourceConstantAlpha := X;
          AlphaFormat := 0;
     end;


Nejdůležitější je SourceConstantAlpha, ve které je uložena průhednost, a to typu byte, tedy od 0 do 255. Nyní již známe vše potřebné, a tak si vytvoříme nová projekt a na formulář přidáme tři komponenty Image a jedno tlačítko. Komponenty Image pojmenujeme SplashImage, BackImage a FinishImage. Do první rovnou nahrajeme nějaký ten obrázek, pokud nemáte žádný při ruce, můžete použít tento, který jsem pro vás připravil:



Do druhé zkopírujeme část obrazovky, na kterou budeme kreslit a v třetím si zobrazíme výsledek, který nakonec zkopírujeme znovu na obrazovku. Až toto celé dokončíme, zkopírujeme na obrazovku obrázek BackImage, čímž ji vymažeme. Zde je již procedura v celé své kráse, kterou jsem doufám dostatečně okomentoval, takže další komentář není snad nutný:


// zobrazení SPLASH SCREEN
procedure TForm1.SplashButtonClick(Sender: TObject);
var cx,cy,i:integer;             // střed obrazovky...
    CanvScr:TCanvas;             // obrazovka....
    udtBlender: TBlendFunction;  // BlendFunction
begin

// 1*) kde je střed a zkopírujeme pozadí - 400x200 pixelů
 cx:= Screen.Width div 2;
 cy:= Screen.Height div 2;

 CanvScr := TCanvas.create;        // vytvoření canvasu
 CanvScr.handle := GetWindowDC(0); // přiřazení obrazovce

 // zkopírujeme část obrazovky do BackImage
 with BackImage.Canvas do
  begin
   CopyRect(rect(0,0,400,200),CanvScr,rect(cx-200,cy-100,cx+200,cy+100));
  end;

// 2*) postupné zobrazení splash screenu
  // v tomto případě nekreslíme SplashImage na Back, ale
  // naopak - proto for x downto y... je to kvůli
  // průhednosti splashe...
  for i:= 125 downto 0 do
   begin
     with udtBlender do
     begin
          BlendOp := AC_SRC_OVER;
          BlendFlags := 0;
          SourceConstantAlpha := i*2;
          AlphaFormat := 0;
     end;

     // kreslíme SplashImage na FinishImage
     FinishImage.Canvas.Draw(0,0, SplashImage.Picture.Graphic);

     // a s Alpha kreslíme BackImage na FinishImage
     AlphaBlend(FinishImage.Canvas.Handle,
                0, 0, 400, 200,
                BackImage.Canvas.Handle,
                0, 0, 400, 200, udtBlender);

     // celé to ještě zkopírujeme na obrazovku...
     CanvScr.CopyRect(rect(cx-200,cy-100,cx+200,cy+100),
     FinishImage.Canvas,rect(0,0,400,200));

     Application.ProcessMessages;
   end;

 // chvíli počkáme, ať si to každý prohlédne...
 Sleep(3000);

 // a potom smažeme pozadí...
 with CanvScr do
  begin
   CopyRect(rect(cx-200,cy-100,cx+200,cy+100),
BackImage.Canvas,rect(0,0,400,200));
  end;

 // a uvolníme CanvScr...
 CanvScr.Free;
end;


Zdá se vám to složíté ? Věřím, že určitě ne, a že ve vašich aplikacích určitě najde procedura využití. Bohužel však procedura nefunguje ve Windows 95, neměl jsem však příležitost to vyzkoušet, takže toto zbývá na vás. Nakonec ještě přikládám screenshot, jak vypadá zobrazování splash screenu přibližně v polovině, a tím zároveň končím dnešní článek:


Download
ZDE si můžete stáhnout dnes vytvořený program a jeho zdrojáky (335 kB)

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: