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í: vavel
  • Nový dnes Dnes nových 2
  • Nový včera Včera nových: 6
  • Počet uživatelů: Celkem: 4413
Lidé online:
  • Návštěvníci: Návštěvníků: 20
  • Registrovaných Členů: 1
  • Celkem Celkem: 21
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.

2. Custom Controls

Custom Controls jsou na rozdíl od kompozitních - skládaných o trochu složitější. Je to z toho důvodu, že musíme u těchto prvků řídit samotné vykreslování. To nám zároveň dává velkou možnosti, vytvořit si téměř libovolnou komponentu.

Pro naše demonstrační účely si opět vytvoříme ovládací prvek, který bude reprezentovat minutku pro odpočet času. Grafická podoba zbývajícího času bude zobrazena jako přibývající nebo ubývající "koláč". Struktura celého prvku bude po stránce zdrojového kódu stejná jako u komponenty SkladanaMinutka. Pouze nebudeme potřeboval některé části.

V Solution Exporeru klikněte pravým tlačítkem a zvolte Add -> New Item -> Custom Control -> Add. Tím dojde k přídání nové třídy, odvozené od třídy Control. Uvnitř je již vygenerován event handler pro událost Paint. Pojmenujme si nový prvek tím, že se přepneme do pohledu Design a v Properties Window nastavíme vlastnost Name na NovaMinutka.

Protože bude tato komponenta opět využívat Timer, přidejme jej tedy na plochu ovládacího prvku.

Jako minule, začněme vytvořením vnitřních proměnných:

// interval pro Timer - 1s
private int _interval = 1000;
// odpočítávaný čas
private int _limit = 1;
// hlášení zobrazované po vypršení času
private string _alertMessage = "";
// přibývání nebo ubývání "koláče"
private bool _reversion = false;
// aktuální čas
private int _current = 0;
// úhel vykrojení "koláče"
private int _angle = 0;
 V konstruktoru nastavíme interval pro Timer:

public NovaMinutka()
{
   InitializeComponent();

   timer1.Interval = _interval;
}
 Nyní potřebujeme vlastnosti, pro nastavování prvku:

[Category("Behavior")]
[Description("Nastaví časový limit")]
[DisplayName("TimeLimit")]
public int Limit
{
   get
   {
      return _limit;
   }
   set
   {
      // musí být větší než nula z důvodu vykreslování prvku
      // viz. event handler OnPaint
      if (value == 0)
      {
         MessageBox.Show("Musí být větší než nula");
      }
      else
      {
         _limit = value;
      }
   }
}

[Category("Behavior")]
[Description("Nastaví hlášení pri 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;
   }
}
V tuto chvíli následuje veřejná metoda pro spuštění minutky:

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

   // vynucení překreslení prvku
   Refresh();

   // spuštění Timeru
   timer1.Start();
}
V pohledu Design se v Properties Window přepneme do zobrazení událostí a dvojklikem necháme vytvořit event handler Tick pro prvek Timer.

Do tohoto handleru vložíme:

private void timer1_Tick(object sender, EventArgs e)
{
   // byl dosažen konec odpočtu?
   if (_current != _limit)
   {
      // aktuální čas
      _current++;

      // vynucení překreslení
      this.Refresh();
   }
   else
   {
      timer1.Stop();

      // jestliže bylo nastavení hlášení, zobrazí jej
      if (!string.IsNullOrEmpty(_alertMessage))
         MessageBox.Show(_alertMessage, "Minutka", 
            MessageBoxButtons.OK, MessageBoxIcon.Information);
   }
}
Na závěr potřebujeme zajistit vykreslení prvku. K tomu použijeme již vygenerovaný handler OnPaint, který rozšíříme:

protected override void OnPaint(PaintEventArgs pe)
{
   base.OnPaint(pe);

   _angle = _reversion ? (360 / _limit) * (_limit - _current) : (360 / _limit) * _current;

   pe.Graphics.FillPie(new SolidBrush(Color.Salmon), 
      new Rectangle(2, 2, this.Width - 5, this.Height - 5),
      -90, _angle);

   pe.Graphics.DrawEllipse(new Pen(new SolidBrush(Color.Salmon)),
      new Rectangle(0, 0, this.Width - 1, this.Height - 1));
}
Tím máme celou komponentou hotovou. Opět můžeme ještě nastavit ikonu komponenty:

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

A to je už opravdu vše. Jak vidíte vytváření vlastních ovládacích prvků není vůbec nic těžkého a zvládne jej každý, znající základy .NET Frameworku.

Lukáš Kouřil :: 3. května 2008 :: 1157 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ůž...