Ovládací prvek Slider (MFC a C++)
Ovládací prvek Slider, kterému se také někdy říká Track bar, se používá hlavně tam, kde je potřeba dát uživateli možnost zadat nějakou hodnotu v daném rozsahu. Patří do skupiny tzv. Společných ovládacích prvků, takže před jeho použitím musí být inicializované společné prvky (InitCommonControlsEx), což je v MFC děláno automaticky.
Tento prvek je v MFC zastoupen třídou CSliderCtrl, je tedy nutno vložit hlavičkový soubor afxcmn.h. Na obrázku vidíte, jak tento ovládací prvek vypadá:
Vytvoření ovládacího prvku
Stejně jako u všech ostatních prvků i zde použijeme metodu Create. Všechny parametry jsou obvyklé (popsáno u starších článků), jediné, co nás zajímá, je styl ovládacího prvku, tedy první parametr.
CSliderCtrl slider; slider.Create(WS_VISIBLE | WS_CHILD | TBS_HORZ | TBS_BOTTOM | TBS_AUTOTICKS, CRect(10,10,200,100),this,0x100);
Takto uvedený příkaz vytvoří Slider, jaký je na obrázku. Nyní si popíšeme jednotlivé možné styly:
TBS_HORZ - vodorovná orientace
TBS_VERT - svislá orientace
TBS_NOTICKS - zakáže malé černé značky u prvku
TBS_AUTOTICKS - nastaví automaticky malé černé značky
TBS_ENABLESELRANGE - umožňuje zobrazit na prvku výběr určité oblasti
TBS_TOP - zobrazí značky nahoře (pouze u TBS_HORZ)
TBS_BOTTOM - zobrazí značky dole (pouze u TBS_HORZ)
TBS_LEFT - zobrazí značky vlevo (pouze u TBS_VERT)
TBS_RIGHT - zobrazí značky vpravo (pouze u TBS_VERT)
Stylů je ještě více, tohle byly pouze ty hlavní.
Nastavení pozice a rozsahu
První věc, kterou bychom měli udělat po vytvoření, je nastavení rozsahu, což se provádí funkcí SetRange, která má dva parametry a to nejmenší hodnotu a největší hodnotu. Pro opětovné získání rozsahu potom můžeme použít GetRange. Pozice se potom nastavuje pomocí SetPos a zjišťuje pomocí GetPos. Číslo, které této funkci předáme, musí samozřejmě ležet uvnitř zvoleného rozsahu. Zde je příklad:
m_Slider.SetRange(0,100); //Nastaví rozsah 0..100 m_Slider.SetPos(50); //Nastaví pozici 50 (uprostřed)
Nastavení výběru
Pokud při tvorbě prvku použijeme styl TBS_ENABLESELRANGE, tak máme možnost nastavovat rozsah, který bude Slider zobrazovat v bíle části uprostřed. Pro nastavení tohoto výběru slouží funkce SetSelection a pro zjištění GetSelection, zadané hodnoty opět musí ležet v intervalu zadaném v SetRange. Příklad:
m_Slider.SetRange(0,30); //Nastaví rozsah 0..30 m_Slider.SetSelection(10,20); //Zvýrazní (vybere) prostřední třetinu ve slideru
Zde je důležité zmínit, že výběr takto zobrazený se nedá uživatelem nijak měnit (jako třeba pozice) a jde tedy nastavit pouze programově.
Nastavení značek
Pod pojmem "značky" se skrývají čárky, které se zobrazují u slideru a pomáhají určit pozici, kterou chceme nastavit. Zobrazují se ale pouze v případě, že není nastaven styl TBS_NOTICKS. Pokud aktivujeme styl TBS_AUTOTICKS, tak se značky umístí automaticky v rozsahu po 1. To se hodí u malých rozsahů, ale pokud máme například rozsah 0 až 1000000, tak z těchto značek vznikne pouze dlouhá tlustá čára. Pro změnění automatického nastavení slouží funkce SetTicFreq, která nastavuje, jak daleko budou značky u sebe. Pokud nechceme vůbec používat automatické označení a chceme umístit značku například pouze na 3. a 4. pozici, použijeme funkci SetTic. Zde je příklad:
//Vytvořeno se stylem TBS_AUTOTICKS slider.SetRange(0,1000000); //Nastaví rozsah slider.SetTicFreq(100000); //Nastaví značku na každém stotisícém prvku //(bude tam celkem 10 značek) //Vytvořeno BEZ stylu TBS_AUTOTICKS slider.SetRange(0,10); //Rozsah slider.SetTic(3); //Umístí značku na 3. pozici
Události slideru
Poslední věc, kterou potřebujeme, je zachytit změnu pozice slideru. Ten odesílá zprávu WM_HSCROLL nebo WM_VSCROLL (podle orientace) svému nadřazeného oknu a tuto zprávu tedy můžeme zachytit a zpracovat. Obslužná funkce OnH(V)Scroll má poté tři parametry. První je identifikátor události, jež značí, jakým způsobem byla událost vyvolána - jestli zatažením na posuvník nebo stisknutím nějaké klávesy atd. (viz dokumentace). Druhý je aktuální pozice slideru a třetí je ukazatel na ovládací prvek, který zprávu vyvolal. Zde je tedy příklad, který zobrazí zprávu při každé změně pozice:
void COkno::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { MessageBox("Změna pozice!"); CWnd::OnHScroll(nSBCode, nPos, pScrollBar); }
To je tedy vše. Příště bude popsán jednoduchý ovládací prvek Animace.
UPOZORNĚNÍ: Jedná se o archiv článků z let 2003 - 2005, uvedené technologie či postupy již mohou být neaktuální.