Ovládací prvek Button (MFC a C++)

Určitě jste ve svých programech někdy využívali ovládací prvek tlačítko, a proto víte, že se bez něj téměř neobejdete. Nyní se na něj podíváme trošku podrobněji.

Tlačítka zastupuje třída CButton, založená na struktuře "BUTTON" a můžeme se s ní setkat ve čtyřech obměnách: příkazové tlačítko, zaškrtávací pole (checkbox), přepínač a rámeček. Na obrázku je vidíte všechny.

Takhle vypadá tlačítko

Nejprve si tedy ukážeme jak se tlačítko vytváří:

CButton m_wndButton1;

m_wndButton1.Create("Moje tlačítko",WS_VISIBLE | WS_CHILD |
BS_PUSHBUTTON,CRect(10,10,10,50),this,IDC_BUTTON);

Vysvětlení jednotlivých parametrů:

1. Nápis, který se zobrazí na tlačítku.
2. Styl tlačítka
3. Obdélník, který vymezuje plochu tlačítka.
4. Rodič tlačítka
5. Identifikační číslo tlačítka

Jaký typ tlačítka se vytvoří záleží pouze na nastavení stylu tlačítka, zde jsou některé možné hodnoty:

BS_PUSHBUTTON - vytvoří standardní příkazové tlačítko
BS_DEFPUSHBUTTON - používá se v dialogových oknech k identifikaci tlačítka, které se stiskne po stisku klávesy Enter
BS_CHECKBOX - vytvoří zaškrtávací pole
BS_AUTOCHECKBOX - zaškrtávací pole, které se automaticky mění při klepnutí myší.
BS_RADIOBUTTON - vytvoří přepínač
BS_AUTORADIOBUTTON - přepínač, který po klepnutí myši automaticky zruší označení ostatních přepínačů
BS_GROUPBOX - vytvoří rámeček

Osobně vám doporučuji používat pouze příznaky s AUTO (budu je zde používat), protože tím odpadá spoustu zbytečné práce.

Reakce na stisk tlačítka

Reakce na stisk se provádí u všech typů kromě rámečku a to pomocí makra ON_BN_CLICKED.

Příklad:

//V mapě zpráv
ON_BN_CLICKED(IDC_BUTTON,OnButtonClicked)

...

void CHlavniOkno::OnButtonClicked()
{
  MessageBox("Stisknuto!");
}

A nyní si popíšeme jednotlivé typy tlačítek.

Příkazová tlačítka

Vše se provádí tak, jak už bylo popsáno dříve.

Zaškrtávací pole

Zaškrtávací pole se liší od příkazového tím, že má dva stavy. Ty se dají nastavit pomocí funkce SetCheck(), která má jeden parametr určující, jestli se zaškrtne nebo odškrtne.

BST_CHECKED - zaškrtne pole
BST_UNCHECKED - odškrtne pole

Naopak, pokud chceme zjistit stav pole, použijeme funkci GetCheck, která vrací aktuální stav pole.

A nyní si uvedeme příklad

void CHlavniOkno::OnButtonClicked()
{
  if(m_wndButton1.GetCheck()==BST_CHECKED)
    MessageBox("Zaškrtnuto!");
  else
    MessageBox("Odškrtnuto!");
}

Přepínač

Stav přepínačů se opět zjišťuje a nastavuje pomocí funkcí GetCheck() a SetCheck(), takže jediná věc, kterou je potřeba ještě nastavit, je seskupení do skupin. To nám zajistí, že když se vybere jeden přepínač, tak se ty ostatní odškrtnou. A nyní jak na to.

V postatě se musíte řídit pouze následujícími věcmi:

1. Mezi definicemi jednotlivých přepínačů se nesmí vyskytnout definice žádného jiného prvku.
2. Začátek skupiny přepínačů určíte připojením stylu WS_GROUP ke stylu prvního přepínače.
3. Pokud budete za posledním přepínačem vytvářet další ovládací prvky, přidejte prvnímu z nich příznak WS_GROUP.

Příklad:

m_prepinac1.Create("První",WS_CHILD | WS_VISIBLE |
WS_AUTORADIOBUTTON | WS_GROUP,obd,this,ID_R1);

m_prepinac2.Create("Druhý",WS_CHILD | WS_VISIBLE |
WS_AUTORADIOBUTTON,obd,this,ID_R2);

m_prepinac3.Create("Třetí",WS_CHILD | WS_VISIBLE |
WS_AUTORADIOBUTTON,obd,this,ID_R3);

m_zaskrtavaci.Create("Uložit",WS_CHILD | WS_VISIBLE |
WS_GROUP,obd,this,ID_POLE);

Rámečky

Tento ovládací prvek se od ostatních liší tím, že nikdy neodesílá žádné zprávy, slouží tedy pouze k vizuálnímu efektu. Umístěním přepínačů do rámečku se tedy automaticky neseskupí.

UPOZORNĚNÍ: Jedná se o archiv článků z let 2003 - 2005, uvedené technologie či postupy již mohou být neaktuální.