Skip Navigation Links.
Skip Navigation Links.

.net student

microsoft

Vyhledávání v obsahu portálu


Přihlášení uživatele

Přihlášení uživatele

Členové:
  • Poslední nový uživatel Poslední: felhell
  • Nový dnes Dnes nových 2
  • Nový včera Včera nových: 6
  • Počet uživatelů: Celkem: 4412
Lidé online:
  • Návštěvníci: Návštěvníků: 18
  • Registrovaných Členů: 0
  • Celkem Celkem: 18
Mapa Stranek

Vlastní ovládací prvky pro aplikace

Spolu s Visual Studiem je dodávána spousta ovládacích prvků, jako jsou Button, Listbox, Label a další, které je možné použít pro vytváření GUI aplikace. Co však dělat, pokud si ze spousty možností, které jsou ve Visual Studiu standardně, nevyberete, protože ani jeden z nich neposkytuje funkčnost, specifickou pro Vaši aplikaci? V podstatě máte dvě možnosti - zkusit najít na internetu Vám vyhovující komponentu, anebo si vytvořit vlastní ovládací prvek. V tomto článku se dozvíte, jak na druhou možnost.

Úplně na začátku je nutné se zamyslet, zdali je možné komponentu, kterou chceme vytvořit, poskládat z jiných, již hotových prvků, nebo jestli bude náš ovládací prvek natolik specifický, že si jej budeme muset celý nakreslit od základu sami. V obou případech není programování komponenty vůbec složité, jen druhý případ zabere o trochu víc času.

V tomto článku se podíváme na oba typy ovládacích prvků a vytvoříme si vlastní plnohodnotné komponenty. Půjde o prvky představující minutku, u níž si nastavíme čas, který bude odpočítáván, a jehož zbývající hodnota bude vizuálně reprezentována.

 

1. Skládané (Composite) User Controls

Jak je patrné z názvu, tyto uživatelské prvky se vytvářejí skládáním z již hotových komponent. Náš prvek tedy budeme skládat z komponent:

  • Timer zajišťující měření času
  • ProgressBar, jenž bude zajiš'tovat vizuální prezentaci času
  • Label pro zobrazení odpočítavaného času v textové podobě

Dále budeme chtít, aby komponenta implementovala metodu Start, která spustí odpočet času, a vlastnosti nastavované v Properties Window:

  • TimeLimit, pro nastavení odpočítávaného času
  • AlertMessage, nastavující hlášení zobrazené po vypršení času
  • CountDownVisibility, viditelnost odpočítávaného času v textové podobě
  • Reversion, říkající, zdali chceme zobrazovat odpočítávaný čas přidáváním, nebo odebíráním dílků v ProgressBaru

Nyní již máme hotový návrh ovládacího prvku a můžeme spustit Visual Studio. Zvolíme File -> New -> Project. Ve Visual Studiu 2008 zvolíme šablony pro .NET Framework 2.0, jazyk Visual C#, šablonu Windows Form Control Library, projekt pojmenujeme jako MyControls a necháme vytvořit.

Když se nyní podíváte na zdrojový kód vygenerované třídy zjistíte, že jde o úplně obyčejnou třídu, která je odvozena od třídy UserControl. Jako první co uděláme je, že si nově vytvářenou komponentu vhodně pojmenujeme. Zobrazíme si design komponenty a v Properties Window nastavíme vlastnost Name na SkladanaMinutka.

V tuto chvíli pokračujme přesně podle návrhu. Na plochu komponenty umístěme Timer, ProgressBar a Label. ProgressBar přesuňte do levého horního rohu, Label přibližně do středu ProgressBaru a upravte velikost plochy celého ovládacího prvku tak, aby byla stejná jako velikost ProgressBaru. Navíc nastavte vlastnost Visibile prvku Label na false.

Začněme tím, že si vytvoříme vnitřní proměnné, které budou zajišťovat uchovávání hodnot:

// interval pro Timer - 1s
private int _interval = 1000;
// odpočítávaný čas
 private int _limit = 0;
// hlášení zobrazené po vypršení času
private string _alertMessage = "";
// přibývání nebo ubývání ProgressBaru
private bool _reversion = false;
// aktuální čas
private int _current = 0;
// viditelnost textového odpočtu času
private bool _countDownVisibility = false;

Teď si upravme konstruktor prvku, ve kterém bude nastaven interval komponenty Timer:

public SkladanaMinutka()
{
   InitializeComponent();

   timer1.Interval = _interval;
}

Protože budeme chtít, aby se textové zobrazení odpočítávaného času zobrazovalo přesně uprostřed ProgressBaru, napíšeme si krátkou funkci, která bude zajišťovat přepočet pozice prvku Label.

private void Align()
{
   label1.Left = (this.Width - label1.Width) / 2;
   label1.Top = (this.Height - label1.Height) / 2;
}

Nyní musíme zajistit, aby při změně velikosti celého ovládacího prvku SkladanaMinutka došlo také ke změně ProgressBaru tak, aby byl vždy přes celou plochu komponenty.

V Properties Window se přepněte na zobrazení událostí (Events) a vygenerujte event handler pro událost Resize našeho ovládacího prvku SkladanaMinutka. V tomto handleru bude umístěn kód který zajistí změnu velikosti a zároveň vycentrování prvku Label.

private void SkladanaMinutka_Resize(object sender, EventArgs e)
{
   progressBar1.Size = this.Size;
   Align();
}

Dosud jsme programovali pouze vnitřní chování komponenty, nyní vytvoříme části, které budou viditelné pro uživatele našeho prvku a pomocí nichž bude možné s ovládacím prvkem pracovat. Nejprve to budou vlastnosti TimeLimit, AlertMessage, CoutDownVisibility a Reversion, které budou zobrazeny v Properties Window.

[Category("Behavior")]
[Description("Nastaví časový limit")]
[DisplayName("TimeLimit")]
public int Limit
{
   get
   {
      return _limit;
   }
   set
   {
      _limit = value;
   }
}

[Category("Behavior")]
[Description("Nastaví hlášení při vypršení limitu")]
[DisplayName("AlertMessage")]
public string Alert
{
   get
   {
      return _alertMessage;
   }
   set
   {
      _alertMessage = value;
   }
}

[Category("Behavior")]
[Description("Nastaví způsob zobrazení odpočtu")]
[DisplayName("Reversion")]
public bool Reversion
{
   get
   {
      return _reversion;
   }
   set
   {
      _reversion = value;
   }
}

[Category("Behavior")]
[Description("Zobrazit textové počítadlo")]
[DisplayName("CountDownVisibility")]
public bool Pocitadlo
{
   get
   {
      return _countDownVisibility;
   }
   set
   {
      _countDownVisibility = value;
   }
}

Jak vidíte, jde o zcela běžné vlastnosti. To, co stojí za pozornost, jsou atributy těchto vlastností. Mezi atributy, které jsme použili patří:

  • Category, která přiřazuje vlastnost do určité skupiny (v případě, že máte v Properties Window zapnuto zobrazení vlastností ve skupinách)
  • Description, což je popisek vlastnosti, zobrazovaný ve spodní části Properties Window
  • DisplayName, pojmenovávající danou vlastnost. Pokud tento atribut není použit, zobrazovaný název vlastnosti je převzat z názvu vlastnosti uvedeného v kódu

Pro spuštění odpočtu budeme potřebovat veřejnou metodu, který může vypadat takto:

public void Start()
{
   // vynulování aktuálního času
   _current = 0;

   // stanovení aktuální hodnoty ProgressBaru, minima a maxima
   progressBar1.Value = _reversion ? _limit : 0;
   progressBar1.Minimum = 0;
   progressBar1.Maximum = _limit;
            
   // nastavení textového ukazatele zbývajícího času
   label1.Visible = _countDownVisibility;
   label1.Text = string.Format("{0} s.", _limit - _current);
   Align();
            
   // spuštění Timeru
    timer1.Start();
}

 

Úplně poslední, co musíme udělat, je implentovat samotný pohyb ProgressBaru, což provedeme v event handleru Tick komponenty Timer. V design módu se v Properties Window přepneme na zobrazení událostí (Events) a poklepáním vygenerujeme handler pro událost Tick.

private void timer1_Tick(object sender, EventArgs e)
{
   // byl dosažen konec odpočtu?
   if (_current != _limit)
   {
      // směr pohybu ProgressBaru
      progressBar1.Value = _reversion ? --progressBar1.Value : ++progressBar1.Value;
                
      // aktuální čas
      _current++;
                
      // textový ukazatel zbývajícího času
      label1.Text = string.Format("{0} s.", _limit - _current);
      Align();
   }
   else
   {
      timer1.Stop();
      label1.Text = "Nastavený čas vypršel!";
      Align();
      label1.Visible = true;

      // jestliže bylo zadáno hlášení, zobrazí jej
       if (!string.IsNullOrEmpty(_alertMessage))
         MessageBox.Show(_alertMessage, "Minutka", 
            MessageBoxButtons.OK, MessageBoxIcon.Information);
   }
}

Tím je celá komponenta hotová. Vylepšit ji však můžeme přidáním ikony, kterou bude prvek reprezentován v ToolBoxu ve Visual Studiu. To uděláme přidáním atributu ToolboxBitmap před deklaraci třídy:

namespace MyControls
{
    [ToolboxBitmap(typeof(ProgressBar))]
    public partial class SkladanaMinutka : UserControl
    {
        // interval pro Timer - 1s
        private int _interval = 1000;
        // odpočítávaný čas
        private int _limit = 0;

Jako parametr atributu je možné uvést cestu k obrázku (který však musí být velikosti 16x16) nebo typ, ze kterého bude ikona převzata.

Komponentu můžete nyní otestovat buď přidáním nového projektu do aktuálního Solution, nebo vytvořením nového Solution. V tom případě bude nutné přidat komponentu do projektu manuálně, kliknutím pravým tlačítkem myši v Toolboxu a zvolením Chose items... -> Browse a vybráním knihovny s komponentou.

Lukáš Kouřil :: 3. května 2008 :: 1155 shlédnutí :: 0 komentářů
kategorie: Vývoj Windows aplikací

Comments

Nyní zde nejsou žádné kometáře. Buďte první!
Musíte být přihlášen pro posílání komentářů. Přihlásit se můžete zde
Přehled posledních diskuzí

Přehled posledních diskuzí

  1. Nekultura výlepu plakátů [11.21.2008 8:00 dop.]
    Proč proboha je na FEL ČVUT na Karláku budova polepena plakáty na zdech, přímo na omítce? Vrcholnou ukázkou je zeď před ...
  2. RE: SQL server 2008 MSDN AA [11.11.2008 7:26 odp.]
    Diky, ale tim to bohuzel neni.
  3. Dotaz na organizátory MS Festu [11.10.2008 4:31 odp.]
    Ahoj MSP,rád bych se zeptal jednoho z organizátorů MS Festu na jeden nestandardní dotaz, který se mi nechce psát na veře...
  4. RE: SQL server 2008 MSDN AA [11.08.2008 1:51 odp.]
    Dobrý den,pro spuštění instalace SQL Serveru 2008 je třeba mít nainstalován .NET Framework 3.5 Service Pack 1 - je to uv...
Novinky z klubů

Novinky z klubů

  1. Programátorské večery: Tipy a triky pro Visual Studio 13. listopadu 2008
    S Visual Studiem pracujeme každý den, ale málokdo zná šechny užitečné klávesov...
  2. Programátorské večery: PowerShell 12. listopadu 2008
    Platformu PowerShell již netřeba představovat. Co ovšem přináší pro .NET programátory...
  3. Programátorské večery: Entity Framework 30. října 2008
    Na této akci bude představena technologie Entity Framework. Podíváme se na tato témata: ...
  4. Programátorské večery: LINQ 26. října 2008
    LINQ je nový revoluční přístup pro práci s daty, který přichází s .NET ...
Co se píše jinde

Co se píše jinde

Řešení problémů s identitou webu u Personal Information Cards

Téměř přesně před rokem jsem si v článku Jak se zjišťuje identita webu u Personal Information Cards? stěžoval na to, ...

TechEd Developers 2008: Den druhý až čtvrtý

Konečně jsem získal dostatek času, abych sepsal zážitky z druhého až čtvrtého dne TechEdu.

TechEd Developers 2008: Den první

První den TechEdu je vždycky takový nanečisto, ostatně jsou v něm jenom dva přednáškové sloty. A keynote. Na co že se...

Výběr serveru

Výběr vhodného serveru představuje volbu při níž musíme přihlédnout k mnoha kritériím, které lze shrnout do následují...

Podívejte se své cache na zoubek

Robustní cacheovací mechanismus je jedna z nejužitečnějších technologií, jaké ASP.NET nabízí. Při vhodném použití můž...