Vlastní ProgressBar v C#

C# .NET Windows Forms Vlastní ProgressBar v C#

V tomto tutoriálu si popíšeme jak jednoduše vytvořit progressBar (dále jen PB) s vlastním vzhledem. Ve své podstatě se již potom nejedná o PB jako takový, ale uděláme si k němu metody, aby fungoval stejně jako normální. Využijeme k tomu panely, protože mají tu výhodu, že se u nich dá nastavit Tile(opakování) obrázku v pozadí.

Nejprve si vytvoříme nějaké pozadí pro náš PB, dávám přednost šířce 1px a výšku si můžeme nastavit libovolnou.

(obrázek je 16x zvětšený)

Doporučuji si pro jednodušší umisťování vytvořit panel, který bude sloužit jako "krabice" pro ostatní součásti našeho PB. Zjednoduší nám to pozdější práci s naším PB, například při přemisťování. Tento panel může mít libovolnou velikost, já pro názornost použiji o 1px na šířku větší než samotný PB, tedy 152px a výšku si dám třeba 30px.

Do tohoto hlavního panelu si potom umístíme další panel, který už bude mít však určitější velikost, Výšku si nastavíme stejnou jako u vytvořeného pozadí, a šířku však můžeme mít libovolnou, já jsem použil šířku 150px.

Dále je třeba si vytvořit ještě popředí našeho PB, to by mělo mít stejnou velikost jako pozadí.

Tomuto panelu nastavíme jako pozadí náš druhý obrazek, který chceme mít v popředí. Důležité je, aby byl náš panel popředí nad panelem pozadí, když tomu tak není tak stačí dát tlačítko BringToFront, nebo si do kódu pod InitializeCom­ponent(); umístit: [název panelu].BringTo­Front(); Poté co víme jak náš panel popředí vypadá tak mu nastavíme šířku na 0px.

Nyní by měl náš PB vypadat zhruba takto:

Takhle bude náš PB vypadat na konci, teď je čas dát mu nějákou funkčnost.

První si vytvoříme Metodu na určení hodnoty, v tomto příkladu budu mít například maximální hodnotu 100 a minimální 0.

private void Set_PB_Value(int Value)
{
    PB_Foreground.Width = (int)(Value * (PB_Background.Width / 100F));
}

kde:

  • PB_Foreground je panel popředí (v tomto případě červený),
  • PB_Background je panel pozadí (v tomto případě šedý),
  • Value je vstupní hodnota v procentech od 0 do 100

Tím by jsme měli základ našeho PB. Výhodou je, když mu dáme možnost vrátit také nějakou hodnotu tím, že na něj klikneme myší. K tomu si napíšemem metodu.

private void PB_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                double mouse_x = (Control.MousePosition.X - this.Location.X - 3 - (CPB_Container.Location.X + PB_Background.Location.X));
                double Value = ((mouse_x / PB_Background.Width) * 100);

                // Vrácená hodnota určí hodnotu PB
                Set_PB_Value((int)Value);

                // Kontrola vrácené hodnoty
                numericUpDown1.Value = (decimal)Value;
            }
        }

kde:

  • -3 je použito pouze pokud nemáme nastavený form bez okrajů, jinak to vynecháme,
  • CPB_Container je panel naší "krabice" který obsahuje ostatní části našeho PB,
  • PB_Background viz výše,
  • PB_Foreground viz výše,

Ještě bych dodal, že tuto metodu si nastavíme jako MouseClickEvent u obou panelů (popředí i pozadí).

To by bylo vše k vlastnímu progressBaru. Doufám, že jsem to popsal dost srozumitelně i pro ty, kteří se s tím ještě nesetkali.


 

Stáhnout

Staženo 499x (47.32 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal Theodor Johnson
Avatar
Autor má většinou na svědomí projekty v jazyce C#.

Jak se ti líbí článek?
Celkem (5 hlasů) :
4.24.24.24.2 4.2


 


Miniatura
Předchozí článek
Tray ikona v C#
Miniatura
Všechny články v sekci
Okenní aplikace v C#

 

 

Komentáře
Zobrazit starší komentáře (1)

Avatar
Theodor Johnson
Redaktor
Avatar
Theodor Johnson:

Díky za radu, zaměřím se na to

Odpovědět 18.11.2012 21:22
Přecházím na "Cross-Platform Development"
Avatar
Odpovídá na Theodor Johnson
taraldarion92:

Urcite bych takhle negeneralizoval, nekdo treba dava prednost psat public metody a promene s velkym pismenem a private s malym (imho velice dobre a prehledne pouzivaji i v Microsoftu :) ), nekdo ma zase rad podtrzitka, dulezita je hlavne konzistence (ktera zde neni uplne presna viz mouse_x a Value :) ). Navic pri praci na jakemkoli projektu ve vice lidech se muze pouzivat jista konvence a diskuze opravdu neni na miste. Kazdopadne o tom programovani neni, nenech se zavalit hloupostmi :)
Pekny tutorial mimochodem :)

 
Odpovědět 19.11.2012 23:42
Avatar
Kit
Redaktor
Avatar
Odpovídá na taraldarion92
Kit:

V různých firmách mohou být ty konvence odlišné a netýkají se jen velikosti písmen. Určitě je dobré si nějaký standard vypěstovat i pro sebe, nejlépe odvozený od nějakého existujícího. Možná jsou v některých firmách i validátory, které nepustí do hlavního repozitáře kód, který tento standard nesplňuje.

Rozdíly v konvencích jsou i mezi jazyky. V některých se dodnes píší klíčová slova velkými písmeny, v jiných se píší velkými názvy proměnných nebo funkcí.

Všechny tyto konvence byly vytvořeny jen kvůli snadné orientaci v programech. Třeba jen samotného autora, ale hlavně kvůli spolupráci skupiny.

Program v článku moc prohřešků proti běžným konvencím neobsahuje. Viděl jsem i tady mnohem horší.

Odpovědět 20.11.2012 7:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na taraldarion92
David Čápka:

Já bych takto určitě generalizoval. Konvence jsou spjaty hlavně s jazykem, např. v Javě nebo PHP jsou metody camelCase s malým písmenem, podtržítka máš třeba v Ruby, tam zas neuvidíš camelCase. Celý .NET framework je napsaný pomocí konvencí, které jsem zmínil výše, se podívej jak se jmenují všechny metody ve všech knihovnách. Používat cokoli jiného je špatně, pokud ti to nenařídí tvůj zaměstnavatel a nemá k tomu nějaký důvod (např. kompatibilitu s kódem v dalším jazyce). Ohledně privátních metod a parametrů se z historického důvodu občas používá podtržítkový prefix.

Odpovědět 20.11.2012 10:53
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Pokud by to mělo být jak píšeš, nebylo by špatné, pokud by to kompilátory označovaly warningy. Případně volitelně. Podobně by mohly zpracovávat chybné odsazení, příkazové závorky, které nejsou pod sebou apod. V tomto směru vede asi Python, protože ten určitou kulturu zápisu vyžaduje přímo v syntaxi.

Odpovědět 20.11.2012 14:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na David Čápka
taraldarion92:

Bohuzel ani s tim php nemas pravdu, prakticky kazdy framework ma/muze mit trochu jine konvence viz stackoverflow­.com/question­s/332831/best-practices-for-naming-conventions
Souhlasim s tim ze je rozumne zrovna v C# nepouzivat podtrzitka protoze to je jako pest na oko a vetsina lidi to nedela, ale jak jsem rekl, vubec nezalezi jakou konvenci clovek pouziva, hlavne kdyz je konzistentni. Dlasi diskuze by mohla byt o psani zavorek, mezer a podobne. Vsechno je to pro citelnost dulezite ale jestli clovek pise
if(true){
}
nebo
if(true)
{
}
je opravdu irelevantni za predpokladu ze se jednoho zpusobu drzi v celem kodu.

Jeste dodam ze vyhoda private/public male/velke muze byt predevsim u properties.
private int value;
public int Value { get; set; }
od toho uz neni daleko k tomu psat s velkym public a s malym private atributy
(podtrzitkovy prefix v caseSensitive c# neni nutny). A znovu dulezita vec: dava to smysl a je to konzistentni a nevidim duvod proc to nepouzit.

Jak jsem rikal, nikdo by se v konvencich kodovani nemel prilis utopit, na co je takove krasne napsane exponencialni reseni ze? :)
To je odeme vse, diskuze je dost nesmyslna, navic pod cizim tutorialem :)

 
Odpovědět 20.11.2012 14:36
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na taraldarion92
David Čápka:

PHP je kapitola sama pro sebe, nebyl to odemne nejlepší příklad. Konvence vycházejí z interních struktur daného jazyka, PHP má samo konvence nekonzistentní, viz funkce strtr(), dále mysql_real_es­cape_string() nebo dokonce htmlspecialchar­s_decode(). Proto je zrovna u něj velký bordel umocněný tím, že starší verze byly neobjektové. Od pětky se uplatňuje konvence, kterou jsem uvedl, starší frameworky co nechtějí přepisovat zdrojáky mohou mít konvence špatně, ale to je dané jen nízkou kvalitou jazyka.

S psaním závorek a mezer s tebou nesouhlasím, to je něco úplně jiného. To se přeci nastaví v IDE a člověk to může u celého projektu během okamžiku automaticky přeformátovat. Měnit jména metod nebo atributů již není tak triviální, je to zásah do logiky.

Tvou výhodu velké/malé u vlastností nechápu. Uvedl jsi atribut value, ten je s malým písmenem, protože je to atribut. Uvedl jsi vlastnost Value, ta je s velkým, protože vlastnost je metoda, čili je to podle konvence, co jsem uvedl výše. Moc nechápu, proč bych měl vlastnost a atribut se stejným jménem, možná si to pleteš se starší verzi C#, kde se vlastnosti negenerovaly automaticky, nyní stačí jen to Value { get; set; }.

Diskuze mi nepřijde nesmyslná a rád ji později přesunu do fóra, aby zde nestrašila.

Editováno 21.11.2012 7:11
Odpovědět 21.11.2012 7:01
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na taraldarion92
David Čápka:

"public metody a promene s velkym pismenem a private s malym (imho velice dobre a prehledne pouzivaji i v Microsoftu) " - Teď mi to došlo, ty si totiž jen pleteš field a property, tedy atribut a vlastnost. Protože vlastnosti jsou vždy veřejné (privátní nemají smysl) a atributy téměř vždy privátní (co jde ven je většinou vlastnost), myslíš si, že viditelnost určuje velikost písmene. Je to ale tak, že atribut je atribut a vlastnost je metoda. Viditelnost s tím nemá nic společného.

Editováno 21.11.2012 7:37
Odpovědět 21.11.2012 7:35
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Uniká mi, proč privátní vlastnosti nemají smysl.

Odpovědět 21.11.2012 7:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

To jsem asi trochu přehnal, ale ještě jsem takovou vlastnost neviděl. Primární účel vlastností vidím v .NETu v tom, aby 3. strana užívající danou komponentu tuto komponentu nepoužila špatně nebo ji nedostala do nekonzistentního stavu. Uvnitř své třídy obvykle vím jak atributy používat nebo si vytvořím metody. Máš pravdu, že by mohla být někdy užitečná.

Odpovědět 21.11.2012 9:10
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 11. Zobrazit vše