GUI ve a MFC I II
Obsah okenní třída okno styly okna okenní funkce důležité zprávy základní ovládací prvky okno z pohledu MFC 2
Vytvoření okna registrace obsluhy zpráv nepovinné pro standardní ovládací prvky okenní třída vytvoření okna spuštění smyčky zpráv reakce na vybrané zprávy 3
Okenní třída určuje některé aspekty chování okna menu kurzor (předdefinované standardní) ikona (předdefinované standardní) pozadí (předdefinované standardní barvy) jméno třídy (nutná jedinečnost) obsluhu událostí registrace: před vytvořením okna struktura WNDCLASSEX RegisterClassEx ukončení platnosti: UnregisterClass 4
Okenní třída: Rozsah působnosti systémové třídy třídy pro základní ovládací prvky vytvořeny systémem dostupné v každém procesu globální třídy aplikace dostupné v každém modulu aplikace použití podobné systémové třídě: registry vhodné explicitní ukončení platnosti lokální třídy aplikace dostupné pouze v modulu, který je vytvořil rušeny automaticky po uzavření modulu 5
Okno nejobecnější stavební prvek GUI chování okna definováno styly okenní třídy a okna okenní funkcí identifikace a adresace okna handle HWND: užito funkcemi identifikátor ovládacího prvku titulek okna: FindWindow 6
Okno: Součásti okna klientská část vnitřní oblast okna obsahuje zpravidla ovládací prvky cíl pro vykreslování klientská oblast standardní součásti okna neklientská část zbylá oblast okna title bar, menu bar, rámeček, atd. lze kreslit: viz uživatelské prvky v titulku rozměry standardních částí okna GetSystemMetrics 7
Okno: Child Onwed okno child okno nemůže samostatně existovat klientská oblast rodičovského okna může postoupit zprávu svému rodiči zpravidla označeno číslem dialog: odkaz na okna dle identifikátoru užití: ovládací prvky owned okno zpravidla samostatné okno vlastník nemůže překrýt vlastněné okno 8
Okno: Aplikační Desktop aplikační okno top-level okno apliakce nemusí být viditelné: aplikace v trayi nepovinné pro dialogové aplikace možnost nalézt dané okno: FindWindow procházet okna: EnumWindows desktop: pracovní plocha GetDesktopWindow užití: screenshot nelze kreslit 9
Okno: Focus Default pouze jeden prvek z dialogu/okna focus označení cíle uživatelského vstupu možnost přepínání klávesou <tab> pouze dialogy default standardně předvolený prvek (dialogy) reakce na klávesy <enter>, <esc> 10
Okno: Operace I většina operací: dle hierarchie změna rodiče ovlivní potomka vytvoření: okno nebo ovládací prvek top-level: součást hlavního programu child: reakce na WM_CREATE CreateWindow / CreateWindowEx rozšíření sady stylů o _EX_ zrušení okna indikováno zprávou WM_DESTROY nikdy neposílat zprávu přímo DestroyWindow 11
Okno: Operace II změna vzhledu pozice, umístění: MoveWindow viditelnosti: ShowWindow zakázání/povolení okna: EnableWindow zakázané okno nepřijímá vstup změna informace titulek: SetWindowText další nastavení: SetWindowLong též nastavení uživatelských dat: 32-bitové číslo užití: dodatečné informace pro MDI okno 12
Okno: Významné Styly vzhled WS_VISIBLE: viditelné okno WS_DISABLED: zakázané okno WS_BORDER: ohraničení slabou čarou nastavení WS_CHILD: child okno WS_HSCROLL: horizontální scrollbar WS_GROUP: skupina child oken první okno ze skupiny: WS_GROUP následující po posledním: WS_GROUP WS_TABSTOP: změna focusu tabulátorem pořadí přepínání dáno pořadím vytváření 13
Okno: Významné rozšířující styly WS_EX_MDICHILD MDIChild okénko WS_EX_TOOLWINDOW owned okénko se zůženým title barem WS_EX_TOPMOST okno, které zůstane vždy na vrchu WS_EX_LAYERED předpříprava obsahu: plynulejší vykreslování podpora průhlednosti: průchod zpráv myši 14
Okenní funkce I účel: obsluha zpráv parametry handle okna, které zprávu vyslalo kód zprávy parametry zprávy 2 parametry: 32-bitové číslo interpretace dle kódu zprávy návratová hodnota dle druhu zprávy výsledek obsluhy zprávy: viz WM_CREATE oznámení o obsloužení zprávy: viz WM_PAINT požadovaná hodnota: viz WM_GETICON 15
Okenní funkce II manuální vyvolání okenní funkce nevhodné funkci volat přímo užití: změna chování okna CallWindowProc obsluha neodchycených zpráv implicitní chování okna nutné pro všechny neobsloužené zprávy vhodné pro většinu obsloužených zpráv DefWindowProc subclassing podstrčení vlastní okenní funkce oknu 16
Okenní funkce: Příklad LRESULT CALLBACK MyWndProc( HWND hwnd, /* původce zprávy */ UINT umsg, /* kód zprávy */ WPARAM wpar, /* 1. parametr */ LPARAM lpar) /* 2. parametr */ { switch (umsg) { case WM_CREATE: /* vytvoření okna */ /* reakce na zprávu */ return 0; case WM_DESTROY: /* uzavření okna */ PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,uMsg,wPar,lPar); } 17
SDI MDI Aplikace SDI jedno okno jeden dokument viz Notepad MDI Child okno Frame okno jedno okno více dokumentů okno MDICLIENT třídy správa MDIChild oken správa Window podmenu MDI child okno vytvoření, ovládání a zrušení: WM_MDI* zprávy MDICLIENT oknu nezpracované zprávy: speciální funkce MDIChild okno MDICLIENT Frame okno 18
Přehled zpráv: Správa okna I WM_CREATE reakce na vytvoření okna vhodné volat implicitní obsluhu užití úprava vlastností okna vytvoření child oken WM_DESTROY posláno těsně před zrušením okna child okna stále existují užití dealokace alokovaných zdrojů uzavření aplikace: PostQuitMessage 19
Přehled zpráv: Správa okna II WM_CLOSE požadavek na zrušení okna/aplikace nezavolání implicitní obsluhy: odmítnutí užití blokování uzavření okna/dialogu dotázání se uživatele uložení dat WM_QUIT ukončení smyčky zpráv nezpracovává se smyčka skončí dříve 20
Přehled zpráv: Správa okna III WM_SIZE oznámení o změně velikosti okna způsobu zobrazení okna užití změna pozice/velikosti child ovládacích prvku změna parametrů (OpenGL/DirectX) vhodné překreslit okno implicitně: překreslována pouze změněná část InvalidateRect není vytvářeno přímo reakce na WM_WINDOWPOSCHANGED efektivnější: bez vysílání WM_SIZE 21
Přehled zpráv: Vykreslování WM_PAINT vykreslení klientské části okna manuální vyvolání: RedrawWindow oblasti pro překreslení: GetUpdateRect úspora času: vykreslení pouze omezené oblasti po vykreslení: nutno zpoplatnit oblast implicitní obsluha nebo ValidateRect nezpoplatnění oblasti: opětovné WM_PAINT neklientská část: WM_NCPAINT WM_ERASEBKGND žádost na vymazání klientské oblasti původce problikávání při překreslování 22
Přehled zpráv: Další WM_COMMAND akce iniciovaná uživatelem ohlášení změny stavu v child ovládacím prvku výběru položky z menu, stisk tlačítka WM_NOTIFY oznámení o operaci / akci uživatele identifikace události ve wparam: NM_* WM_GETMINMAXINFO požadavek na informaci o rozměrech okna užití: omezení max./min. rozměrů okna 23
Ovládací prvky I ovládací prvek: předdefinovaná třída možnost změny vzhledu bez změny třídy nastavování a operace zpráva: SendMessage pojmenování: ZkratkaPrvkuM_Operace makra: zpravidla zpráva + konverze dat pojmenování: NázevPrvku_Operace speciální funkce API fonty: implicitně systémové nastavení: WM_SETFONT dialogy: součást definice dialogu 24
Ovládací prvky II oznámení o změně zasíláno rodiči výběr z menu: WM_COMMAND oznámení o události: WM_NOTIFY speciální situace vykreslení owner-drawn: WM_DRAWITEM posun scrollbaru, slideru: WM_HSCROLL identifikátory zpráv: PREFIX_NÁZEV PREFIX: dle ovládacího prvku poslední znak: identifikace typu zprávy žádný nebo 'M': ovládání okenní zprávou 'N': oznámení okenní zprávou pro WM_NOTIFY 'S': styl okna pro CreateWindow 25
Ovládací prvky: Statické prvky neaktivní prvky bez reakce na uživatelův vstup okenní třída: "Static" typy obrázek textová informace rámeček bez textové informace užití organizace plochy seskupení ovládacích prvků 26
Ovládací prvky: Tlačítko I okenní třída: "Button" push button dva stavy: stlačený / nestlačený užití: spuštění akce tlačítkem specifikováno stylem: BS_PUSHBUTTON default tlačítko: BS_DEFPUSHBUTTON check box podpora třetího stavu užití: výběr možnosti specifikováno stylem: BS_CHECKBOX 27
Ovládací prvky: Tlačítko II radio button dva stavy: zaškrtlý / nezašktlý automatické přepínánív rámci skupiny užití: výběr jedné možnosti z specifikováno stylem BS_RADIOBUTTON group box užití visuální rozdělení plochy seskupení ovládacích prvků bez stavů podobné statickému, ale s popiskem specifikováno stylem BS_GROUPBOX 28
Ovládací prvky: Edit Box textový vstup uživatele možnost víceřádkového vstupu omezení počtu znaků: EM_SETLIMITTEXT oznámení o dosažení maxima: EN_MAXTEXT výběru oblasti řetězce podpora pro práci s clipboardem zakrytí obsahu (heslo): ES_PASSWORD implicitně: '*', ale možnost změny podpory pro vrácení změny: EM_UNDO okenní třída: "Edit" 29
Ovládací prvky: List Box jednosloupcový výběr z položek výběr více položek přiřazení hodnoty položce: 16-bitové číslo kreslení vlastních položek: LBS_OWNERDRAW možnost určení vlastní výšky položky okenní třída: "ListBox" stavy položek selected item vybraná položka(ky) focused item cílová položka pro vstup 30
Ovládací prvky: Combo Box vyskakovací výběr detekce zvolení, uzavření a zrušení výběru kreslení vlastních položek: viz ListBox okenní třída: "ComboBox" typy vyskakovací s možností editace CBS_DROPDOWN vyskakovací bez editace CBS_DROPDOWNLIST jednoduchý s možností editace CBS_SIMPLE edit box + list box 31
Ovládací prvky: Scroll Bar horizontální/vertikální scroll bar okenní třída: "ScrollBar" operace reakce na akce uživatele zpráva: WM_HSCROLL / WM_VSCROLL po obsluze nutno nastavit pozici scroll baru skrytí scrollbaru / blokace jezdece programově skrytím okna velikost jezdce > délka dráhy nastavení základních vlastností pozice jezdce: SetScrollPos parametry dráhy: SetScrollRange 32
Ovládací prvky: Rich Edit edit box s RTF podporou operace ukládání, načítání RTF změna vlastností části textu práce se schránkou okenní třída "RichEdit" (rich edit 1.0) "RichEdit20W" (rich edit 2.0) podpora pro vrácení vrácení změny: EM_REDO "RichEdit30W" (rich edit 3.0) podpora pro dělení slov a změnu měřítka 33
MFC okenní třída: viz registrace: AfxRegisterWndClass základní okno: potomek CWnd vytvoření viz : Create připojení na existující handle okna: Attach handle na okno: GetSafeHwnd / m_hwnd okno rámce: potomek CFrameWnd užití: hlavní okno aplikace mechanizmus Doc/View možnost vytvoření + nastavení z resources natažení menu, titulku a ikony: LoadFrame MFC 34
MFC: Ovládací prvky specializovaní potomci třídy CWnd static: CStatic tlačítko + specializace: CButton edit box: CEdit combo box: CComboBox list box: CListBox scroll bar: CScrollBar rich edit: CRichEdit inicializace před první užitím: AfxInitRichEdit MFC 35
Pokračování příště děkuji za pozornost příště GUI ve a MFC II nezapomeňte nakrmit tygry 36