Implementace GUI SCStudio Bc. Milan Malota Faculty of Informatics, Masaryk University 7. listopad 2012 1 / 2 Příprava Implementace Příprava vědět, co musí grafické rozhraní umět jsou jednotlivé položky dostatečně srozumitelné rozmyslet do jakého oddílu nové GUI začlenit Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Znalosti na pozadí využíváme rodinu funkcí a definových elementů z ATL1 nejsou svázany licenčními podmínkami spousta užitku s minimem ručně psaného kódu jednotlivé prvky jsou v hlavičkových souborech atl*.h slabší dokumentace dialog třídy pojmenováváme s koncovkou Dlg k tvorbě využíváme rozhraní Visual Studia hodnoty se ukládájí ve Windows Registry2 1 Active Template Library 2 tohle nás již moc nezajímá vše je v registryManager.h Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Model dialogu nejprve je nutné vymodelovat nový dialog ve Visual Studiu, dále VS, otevřeme Resource View3 ve scstudio → dllmodule.rc nalezneme klíč Dialog klikneme na něj pravým tlačítkem myši a zvolíme AddResource → New otevře se nám prázdné okno pokud bude dialog součásti hlavního Options pak je nutné nastavit Style = Child Border = None TitleBar = False a smazat potvrzovací tlačítka 3 View → Resource View Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Model dialogu II pokud máme vytvořený nový dialog můžeme začít vkládat jednotlivé elementy dialogu elementy nalezneme v kartě Toolbox, jednoduše je lze přetáhnout na potřebné místo každý z elementů má své Properties jednotlivé elementy identifikujeme velkými písmeny podle toho, co vyjadřují4 pokud je GUI vymodelované a prvky pojmenované, můžeme se pustit do implementace chování 4 př.: IDC V ALUE INST ANCE LENGT H Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Model dialogu III Příklad: IDD BEAUTIFY SETTING Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Implementace chování - hlavičkový soubor nyní vytvoříme třídu simulující chování dialogu pro začátek můžeme zkopírovat některou z již existujících tříd třída T musí dědit z ATL::CSettingsPageDialog a CWinDataExchange T public members enum IDD od dialogu, ke kterému se třída vztahuje konstruktor bere Visio::IVApplicationPtr vsoApp a naplňuje hodnoty rodiče5 destruktor 5 T Dlg(V isio :: IV ApplicationP trvsoApp) : CSettingsP ageDialog(IDD, true, T Dlg :: StartDialogP roc), m vsoApp(vsoApp) Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Implementace chování - hlavičkový soubor II public members II dále určíme cestu v registrech, kde se nám budou ukládat hodnoty vytvoříme si proměnné ve kterých se budou jednotlivé hodnoty ukládat během práce s dialogem editbox → float m my name value checkbox → int m my name radiobutton → long m use my name Příklad: mějme editbox do něhož uživatel ukládá hodnotu délky ztracené/nalezené zprávy. Podle společné konvence jsme jej nazvali kupříkladu: IDC V ALUE INCOMPLETE MESSAGE, hodnota s kterou operujeme je typu float, a proto si definujeme: float m length incomplete msg value. Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Implementace chování - hlavičkový soubor III private members v privátních atributech jsou definovány handlery a objekty dialogu6 v BEGIN DDX MAP(TDlg) nalezneme různé HANDLERY v závislosti na objektu s kterým pracujeme DDX CONT ROL HANDLE → přiřazuje název radio buttonu k objektu CButton DDX F LOAT RANGE → handler, který automaticky testuje, zda hodnota v edit boxu splňuje daná omezení DDX F LOAT → přiřazuje název editboxu k proměnné typy float a spousta dalších... mapu ukončíme END DDX MAP Příklad: již jsme řekli, že máme definované IDC V ALUE INCOMPLETE MESSAGE a m length incomplete msg value, a chceme hodnotu v editboxu svázat s touto proměnnou. 6 př.: CButton, CEdit, CUpDownCtrl Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Implementace chování - hlavičkový soubor III private members v privátních atributech jsou definovány handlery a objekty dialogu6 v BEGIN DDX MAP(TDlg) nalezneme různé HANDLERY v závislosti na objektu s kterým pracujeme DDX CONT ROL HANDLE → přiřazuje název radio buttonu k objektu CButton DDX F LOAT RANGE → handler, který automaticky testuje, zda hodnota v edit boxu splňuje daná omezení DDX F LOAT → přiřazuje název editboxu k proměnné typy float a spousta dalších... mapu ukončíme END DDX MAP Příklad: již jsme řekli, že máme definované IDC V ALUE INCOMPLETE MESSAGE a m length incomplete msg value, a chceme hodnotu v editboxu svázat s touto proměnnou. Řešení: pomocí DDX FLOAT RANGE lze například otestovat, zda je číslo kladné pomocí DDX FLOAT přiřadíme k IDC V ALUE INCOMPLETE MESSAGE hodnotu typu float 6 př.: CButton, CEdit, CUpDownCtrl Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Implementace chování - hlavičkový soubor III private members II mapa zpráv, neboli funkcí, které se provedou při nějaké akci s dialogem typicky otevření okna, co se má udělat pokud někdo klikne na nějaké radio, co má udělat v BEGIN MSG MAP(TDlg) nalezneme různé HANDLERY v závislosti na objektu s kterým pracujeme MESSAGE HANDLER → typicky pro vytvoření funkce OnInitDialog COMMAND ID HANDLER → přiřazuje k názvu nějakého radia funkci, která se má vykonat, pokud systém detekuje, že se s radiem něco stalo, př.: byl označen a spousta dalších... mapu ukončíme END MSG MAP Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Implementace chování - hlavičkový soubor IV private (definice funkcí dialogu) dále definice funkcí: voidOnDataV alidateError(UINT nCtrlID, BOOLbSave, XData&data); voidOnDataExchangeError(UINT nCtrlID, BOOLbSave); definice LRESULTOnInitDialog(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL&bHandled); pokud je dialog členem hlavního nastavení pak musíme přepsat OnApply a OnHelp() dále definice všech funkcí které jsme nadefinovali v MSG MAP Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Implementace metod implementace definic z hlavičkového souboru OnInitDialog co se děje pokud se má vytvořit naše GUI nejprve dokončíme nalepení jednotlivých prvků dialogu na objekty definované v hlavičče, které jsme nenalepili pomocí DDX MAP (T Dlg) Příklad: přiřazení spinboxu, využíváme Attach; vytvoření tooltipu Milan Malota Implementace GUI SCStudio Příprava Implementace Znalosti na pozadí Tvorba dialogu Implementace metod implementace definic z hlavičkového souboru OnInitDialog co se děje pokud se má vytvořit naše GUI nejprve dokončíme nalepení jednotlivých prvků dialogu na objekty definované v hlavičče, které jsme nenalepili pomocí DDX MAP (T Dlg) Příklad: přiřazení spinboxu, využíváme Attach; vytvoření tooltipu načteme si hodnoty z registrů (LoadRegistryData();) uložíme hodnoty do dialogu pomocí DoDataExchange(F ALSE); a zavoláme UpdateControls(); Milan Malota Implementace GUI SCStudio Dˇekuji za pozornost 2 / 2