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á:

Takto vypadá Slider

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í.