reklama

Staňte se programátorem: Linuxové efekty levou zadní II.

V minulé části jste se mohli seznámit se základy tvorby zajímavých efektů oken v prostředí .NET Framework, dnes se podíváme na konkrétní kód, jak pomocí animace zmenšit okno a další.

V předchozí části jsme si ukázali základní metody a vlastnosti třídy System.Windows.Form, které v prostředí .NET Framework představuje okno, pomocí kterých můžeme vytvářet jednoduché efekty formuláře. V dnešním díle si jednotlivé efekty popíšeme.

Doporučujeme: Přečtěte si první část článku o tvorbě jednoduchých efektů oken, kde najdete obecný popis techniky, obrázky a další informace

Zmenšování obrázku při uzavření

Pro vykonání tohoto efektu je nutné vytvořit kolekci (v našem případě generickou frontu) a tu následně naplnit určitým počtem obrázků, přičemž platí, že každý obrázek bude o něco menší než ten předchozí, díky čemuž při rychlém promítání jednotlivých obrázků vznikne kinematografická iluze plynulého pohybu. Následně vytvoříme formulář, na jehož pozadí budou promítány jednotlivé obrázky uložené ve frontě.

Klepněte pro větší obrázek Klepněte pro větší obrázek Klepněte pro větší obrázek
Pokud budete postupně zobrazovat menší a menší miniaturu okna, vznikne pěkný efekt

Rychlost animace bude stanovena pomocí třídy System.Windows.Forms.Timer představující časovač. Pomocí jeho vlastnosti Interval nastavíme interval mezi jednotlivými tiky (v případě Timeru to je zavolání události Tick) na 1 ms. Jak jsem již naznačil – jednotlivé obrázky budou ukládány do fronty, což je kolekce, ze které můžeme dostat (tedy vrátit a poté z kolekce odstranit) vždy právě jeden prvek a to ten, který byl do fronty zařazen po předchozím vráceném prvku. Tedy prvek vložený do jako první do fronty, bude z ní také jako první vrácen atd.

// Vytvoří generickou frontu
Queue<Image> q = new Queue<Image>();
PictureForm pf;

void Button3Click(object sender, EventArgs e)
{
  q.Clear();
  // Postupně uloží miniatury obrázku do fronty
  Bitmap b = new Bitmap(this.Width,this.Height);
  this.DrawToBitmap(b, new Rectangle(0,0, this.Width,this.Height));
  Image im = (Image)b;
  pf = new PictureForm(this);
  for (int x = 0; x < this.Width ; x +=4)
  {
    q.Enqueue(this.UpravRozmerObrazku(im,this.Width- x, this.Height -x));
  }
  this.Hide();
  pf.Show();
  pf.Location = this.Location;
  // Spustí timer vykonávající animaci
  timer2.Start();
}

// Událost bude timerem zavolána každou milisekundu
void Timer2Tick(object sender, EventArgs e)
{
  // Postupně vybere z fronty všechny obrázky
  // a zobrazí je v okně typu PictureForm.
  // Rychle se měnící obrázky způsobí iluzi zmenšování
  if (q.Count > 0)
  {
    pf.pictureBox1.Image = q.Dequeue();
    pf.pictureBox1.Location = new Point(pf.pictureBox1.Location.X+2 ,
    pf.pictureBox1.Location.Y +2);
  }
  else
  {
    // Pokud dojdou ve frontě obrázky, formulář se zavře
    pf.Close();
    this.Show();
  }
}

Zneviditelnění okna

Pro zneviditelnění okna použijeme Timer, s jehož pomocí při každém tiku snížíme průhlednost formuláře (vlastnost Opacity) do té doby, dokud nebude rovna 0.

Klepněte pro větší obrázek Klepněte pro větší obrázek Klepněte pro větší obrázek
Pokud budete průhlednost měnit spojitě, ve smyčce nebo pomocí časovače, vznikne pěkný mizící efekt

void Timer1Tick(object sender, EventArgs e)
{
  // Každou milisekundu sníží průhlednost formuláře o 1%
  if (this.Opacity > 0)
    this.Opacity -= 0.01;
  else
  {
    timer1.Stop();
  }
}

Zobrazení miniatur oken

Pro zobrazení miniatur je nutné získat snímky všech oken pomocí metody DrawToBitmap daného formuláře, zmenšit je a umístit je na formulář o stejné velikosti. Více řekne následující kód.

Klepněte pro větší obrázek
Okna vypadají a chovají se jako ikony

// V generické kolekci List budou uložena všechna okna na kterých bude efekt
// aplikován

List<Form> okna = new List<Form>();
// Zobrazí miniatury všech oken

private void button1_Click(object sender, EventArgs e)
{
  // Projde jednotlivá okna, které jsou uloženy
  // V generické kolekci List, tyto okna budou
  // „zmenšena“

  for (int x = 0; x < okna.Count; x++)
  {
    try
    {
      // Vybere aktuálně iterované okno
      Form vybr = okna[x];
      // Nastaví normální velikost okna
      vybr.WindowState = FormWindowState.Normal;
      vybr.Opacity = 0;
      // Skryje okno
      vybr.Hide();
      Bitmap b = new Bitmap(vybr.Width, vybr.Height);
      Image im = (Image)b;
      // Překopíruje snímek obrazovky do instance třídy
      // System.Drawing.Bitmap
      vybr.DrawToBitmap(b, new Rectangle(0, 0, vybr.Width, vybr.Height));
      // Vytvoří instanci tøídy PictureForm, na kterém bude zobrazen
      PictureForm pf = new PictureForm(this,
      im.GetThumbnailImage(vybr.Width / 2, vybr.Height /2,
      new Image.GetThumbnailImageAbort(A),IntPtr.Zero),x);
      pf.Size = new Size(vybr.Width/2, vybr.Height/2);
      // Přidá okno do kolekce typu List
      obrazky.Add(pf);
      // Rozmístí okna
      if (x == 0)
      {
        pf.StartPosition = FormStartPosition.CenterScreen;
        pf.Show();
      }
      else if (x % 2 ==1)
      {
        pf.Show();
        PictureForm aktObr = obrazky[x-1];
        pf.Location = new Point(aktObr.Location.X + aktObr.Width , aktObr.Location.Y);
      }
      else
      {
        pf.Show();
        PictureForm aktObr = obrazky[x-2];
        pf.Location = new Point(aktObr.Location.X - pf.Width , aktObr.Location.Y);
      }
    }
    catch{}
  }
}


Samozřejmě nechybí ani zdrojový kód, který je upravený pro bezplatné vývojové prostředí Microsoft Visual C# 2008 Express Edition.

Témata článku: Programování, Front, Elsa, Timer, Catch

19 komentářů

Nejnovější komentáře

  • Septim 20. 2. 2009 17:59:07
    Hm.. v nadpisu clanku bych urcite vynechal " Linuxove efekty " .. a tez...
  • Clarke 20. 2. 2009 11:31:50
    \|||/ (o o) ,----ooO--(_)-------. | Please | | don't feed the | |...
  • pepavondepo 19. 2. 2009 22:12:08
    Z reálné diskuze vás zcela diskvalifikuje vaše vyjádření "Prehistorická...
reklama
Určitě si přečtěte

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

** Herní hardware se od toho běžného často liší jen vzhledem ** Při výběru stále nezapomínejte na základní parametry ** Poradíme jak vybrat herní hardware i periferie

20.  2.  2017 | Stanislav Janů | 36

10 nejhorších produktů v historii Microsoftu

10 nejhorších produktů v historii Microsoftu

20.  2.  2017 | Karel Javůrek | 137

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

** Každý bastlíř se po čase neobjede bez armády švábů ** Dnes si některé z nich vyzkoušíme ** Třeba zázračný posuvný registr

19.  2.  2017 | Jakub Čížek | 39

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

** AMD uvedlo první tři procesory Ryzen 7 ** Všechny budou pracovat s osmi jádry a šestnácti vlákny ** Na pulty obchodů se dostanou už za týden

22.  2.  2017 | Stanislav Janů | 131

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

** Evropští úředníci chtějí, aby byly Desítky transparentnější ** Microsoft od jara skutečně chystá změny ** Ochráncům soukromí to ale nestačí

21.  2.  2017 | Jakub Čížek | 218

Remix Singularity: Microsoft si na tom vylámal zuby. Jak dopadne Android?

Remix Singularity: Microsoft si na tom vylámal zuby. Jak dopadne Android?

** Microsoft do svých telefonů integroval desktopové prostředí ** Moc to ale nevyšlo, chyběl pořádný výkon ** Teď to zkoušejí ex-googleři s Remix Singularity

23.  2.  2017 | Jakub Čížek | 73


Aktuální číslo časopisu Computer

Supertéma o počítačové bezpečnosti

AMD Ryzen přichází

Velké testy kinoprojektorů a levných špuntových sluchátek

Příslušenství do USB-C

reklama
reklama