Ovládácí prvek Edit (MFC a C++)

Ovládací prvek Edit je v MFC zapouzdřen třídou CEdit a slouží pro vstup dat. Používá se především pro získávání kratších textů od uživatele (např. uživ. jméno,heslo) nebo pro jednoduchý výstup textu. Máme dvě možnosti, jak Edit využít. Buď jako jednořádkový, kdy je všechen text zapisován do jedné řádky a nebo jako víceřádkový, kam můžeme psát poměrně rozsáhlé texty. Jediné omezení spočívá v tom, že nemůžeme editovat texty větší než 65KB. Pokud přesto potřebujete pracovat s většími texty, budete muset použít ovládací prvek formátované textové pole , který bude popsán v některém dalším článku. Nejprve si tedy řekneme, jak se Edit vytvoří. Na obrázku vidíte, jak edit vypadá.

Takhle vypadá Edit

Vytvoření Editu

Proměnná m_edit1 je typu CEdit.

m_edit1.Create(WS_VISIBLE | WS_CHILD | WS_BORDER,
  CRect(10,10,100,50),this,IDC_EDIT1);

Pokud použijete tento způsob, vytvoří se úplně jednoduché jednořádkové textové pole, které ovšem nebude mít některé obvyklé vlastnosti (např převíjení obsahu). Pokud chceme pole dále upravovat, můžeme do stylu okna přiřadit některé z těchto vlastností:

ES_MULTILINE - vytvoří se víceřádkové textové pole
ES_AUTOHSCROLL - obsah pole se bude automaticky převíjet v horizontálním směru
ES_PASSWORD - vytvoří pole pro zadávání hesel
ES_READONLY - pole nepůjde editovat
ES_UPPERCASE - všechna písmena budou velká
ES_LOWERCASE - všechna písmena budou malá
ES_LEFT, ES_RIGHT, ES_CENTER - zarovná text doleva, doprava, na střed

Když použijete vlastnost WS_BORDER , tak bude mít pole pouze ploché okraje, což je poněkud nezvyklé. Jestli chcete, aby pole vypadalo standardně, tak si přečtěte konec článku o ListBoxu a třídu CListBox pouze nahraďte třídou CEdit.

Práce s textem

Text, který je právě napsán v editu, zjistíte voláním členské funkce GetWindowText , která má pouze jeden parametr, který určuje řetězec, do kterého se text uloží. Zde je příklad, který nejprve zjistí text a potom ho vypíše na obrazovku:

CString text;

m_edit1.GetWindowText(text);
MessageBox(text);

Pro nastavení textu do pole máme dokonce dvě funkce. První SetWindowText , pouze nastaví text do pole a to, co v něm bylo dříve, smaže a druhá ReplaceSel provede to, že vloží text na místo, kde se právě nachází kurzor, a ostatního textu si nevšímá.

//Vložení s vymazáním starého textu
m_edit1.SetWindowText("Mfc je super!");

//Vložení na aktuální pozici kurzoru
m_edit1.ReplaceSel("- vložený text -");

Ještě bych zmínil funkci GetLine , která kopíruje obsah jedné řádky víceřádkového textového pole do určeného bufferu.

//Zkopíruje druhý řádek
m_edit1.GetLine(1,buffer,delkabufferu);

Edit a schránka

Ovládací prvek CEdit má jednu velkou výhodu, což je jednoduchá práce se schránkou. Jelikož třída tato funkce zapouzdřuje, umožňuje to jednoduché vložení textu do schránky nebo naopak vyzvednutí. Pokud chceme obsah pole vyjmout do schránky, použijeme funkci Cut , když chceme kopírovat, tak funkci Copy a nakonec pro vložení textu ze schránky použijeme funkci Paste . Pozor ovšem na to, že funkce pracují pouze s tím textem, který je právě v poli vybrán. Pokud tedy chceme vybrat text můžeme k tomu použit funkci SetSel , které předáme první a poslední znak, který bude vybrán.

Uvedený příklad nejprve zkopíruje text do schránky, potom editu nastaví jiný text a nakonec text ze schránky zase vloží zpátky. V editu tedy bude to, co tam bylo na začátku.

m_edit.SetWindowText("Text pro schránku!");
m_edit.SetSel(0,17);  //vybrat text
m_edit.Copy();        //kopírovat text

m_edit.SetWindowText("Jiný text");  //nastavit jiný text
m_edit.Paste();     //vložit původní text

Další užitečné funkce

Pokud se podíváte do dokumentace k třídě CEdit, zjistíte, že obsahuje plno všelijakých funkcí pro různá nastavení. A protože některé jsou docela často používané, tak je zde také popíšu.

LimitText - umožňuje nastavit, kolik znaků se do pole může zapsat
SetPasswordChar - nastaví znak, který bude zobrazen v heslovém poli
SetReadOnly - určuje, zda bude edit "jen pro čtení"
Undo - vrací změny provedené v editu
SetRect - nastaví obdélník, ve kterém bude text

Události Editu

Události, které jsou editem vyvolány, se odesílají nadřazenému oknu, které je může zachytávat pomocí maker ON_EN , která uvedeme v mapě zpráv. Nejčastěji se asi používá EN_CHANGE , které indikuje změnu textu v editu. Výpis možných hodnot:

EN_CHANGE - změna textu v editu
EN_UPDATE - odesílá se před změnou textu
EN_MAXTEXT - uživatel se pokouší zapsat do pole více znaku, než je povoleno
EN_HSCROLL - pole je převíjeno v horiz. směru

Příklad na makro EN_CHANGE.

//Mapa zpráv
ON_EN_CHANGE(IDC_EDIT1,OnEditChange)
...
void CMojeOkno::OnEditChange()
{
  MessageBox("Byl změněn text!");
}

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