C++ a wxWidgets (1.díl)

V tomhle a několika následujících článcích si povíme něco o programování aplikací s grafickým rozhraním pomocí knihovny wxWidgets.

wxWidgets

Výhoda této knihovny je v tom, že je multiplatformní. To znamená, že vetšina kódu je shodná jak na Windows tak na UNIXových systémech. Samozřejmě pokud v programu použijeme i jiné knihovny tak už přenositelnost klesá. I přesto je v této knihovně síla, pomocí ní vytvoříme velmi dobré aplikace během chvilky a jednodušeji, než třeba ve WinAPI.

Instalace knihovny je jednoduchá, pro Windows stačí stáhnout installer. Pro UNIXové systémy je dostupná např. v repozitáři nebo ji lze stáhnout a poté je nutné ji zkompilovat. Aktuální verzi ke kurzu najdete zde. Vývojové prostředí budu používat Code::Blocks 10.05, s přeložením kódu by neměl být problém v jakémkoliv jiném IDE. Operační systém budu používat MS Windows, jestliže budou nějaké rozdíly oproti Linuxu, upozorním na ně.

Všechny třídy, funkce a jejich použití najdete v oficiálním manuálu zde.

Pojďme se seznámit s nutnými základy.

wxString

Datový typ shodný s typem standardní knihovny C++ string. Pro přiřazení hodnoty proměnné nebo jakoukoliv práci s řetězci musíme použít funkci wxT().

wxString retezec = wxT("Text"); //inicializace a přiřazení hodnoty řetězce
wxPuts(retezec); //funkce slouží pro zápis na výstupní proud

Pro prácí s ním musíme přidat do souboru hlavičku wx/string.h. Třída obsahuje několik dalších užitečných funkcí pro práci s řetězci:

  • Printf() - slouží k formátování řetezce a následného vypsání na výstup, shodné s formátováním s jazyka C
  • Contains() - zjistí zda daný řetězec obsahuje řetězec daný v parametru
  • Len() – funkce vrací délku řetězce
  • MakeLower() a MakeUpper() - převede řetězec na malá nebo velká písmena
  • Format() – podobné jako Printf, akorát nevypisuje, ale ukládá zpět do proměnné
int main() {
    wxString retezec = wxT("Portal Ajtaci.net");
    if (retezec.Contains(wxT("Portal")) //zjištění zda obsahuje dané slovo
        wxPuts("Obsahuje!");
    retezec.Printf(wxT("Retezec ma delku: %d"), retezec.Len()); //naformátování výpisu délky řetězce
    return 0;
}

Existuje spousta dalších užitečných funkcí, např. pro práci s časem, soubory. K nim se dostaneme později v průběhu kurzu.

První program

Zkusíme si vytvořit jednoduchý program, který vykreslí na obrazovku prázdné okno.

#include //includujeme wx/wx.h
//třída zastupující naše okno
class Okno: public wxFrame {
    public:
        Okno(const wxString& titulek); //deklarace konstruktoru okna
};
//definice konstruktoru
Okno::Okno(const wxString& titulek)
         :wxFrame(NULL, wxID_ANY, titulek, wxDefaultPosition, wxSize(300, 150)) {
    Centre();
}

Vytvořili jsme si třídu, která je potomkem třídy wxFrame, díky tomu získáme funkce pro práci s oknem. Jedinou funkci máme konstruktor třídy. V jeho definici se odkazujeme na kontruktor rodiče třídy. Pro nás zatím důležitý parametr bude titulek, který je typu wxString, jeho obsah bude zobrazený v titulku našeho okna. Dalším parametrem je pozice okna, my jsme nastavili makrem defaultní pozici, pokud chcete jinou pozici použijte funkci wxPoint(x, y). Poslední je velikost okna, která se udává funkcí wxSize(x, y). Funkce Centre() umístí okno po vytvoření doprostřed obrazovky.

Ještě nám zbývá vytvořit třídu, která se postará o zobrazení našeho okna.

#include  //includujeme wx/wx.h
#include "Okno.h" //musíme ještě includovat předchozí soubor s definicí okna
class Aplikace: public wxApp {
    public:
        virtual bool OnInit(); //funkce která je spuštěna ihned po startu aplikace
}
IMPLEMENT_APP(Aplikace); //makro, které implementuje aplikaci
bool Aplikace::OnInit() {
    Okno *okno = new Okno(wxT("Prvni program")); //vytvoří naše okno
    okno->Show(true); //zobrazí
    return true;
}

Třída, kterou jsme právě vytvořili má funkci pouze v implementování předchozího okna. Kód skrytý za makrem IMPLEMENT_APP nám nemusí být přesně znám, důležité je ho uvést v každé aplikaci. Funkce OnInit() vytvoří novou instanci třídy Okno a zobrazí ho.

DÚ: Pořádně si vyzkoušejte práci s řetězci a jejich formátování. Zkuste si taky upravit parametry konstruktoru wxFrame, např. pozici, velikost.

V příštím díle si řekneme něco o událostech a zkusíme vytvořit tlačítka, menu a texty.

http://wordpress.org/extend/plugins/wp-syntax/other_notesV /

O Daniel Švec

Autor se věnuje vývoji aplikací v C/C++, Python. Zajímá se o robotiku, elektrotechniku, a IT.