KIV / WIN
GUI ve Win32API 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
KIV / WIN
●
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 KIV / WIN
●
Win32API
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í ■
KIV / WIN
●
registrace: před vytvořením okna struktura WNDCLASSEX ■ RegisterClassEx ■ ukončení platnosti: UnregisterClass ■
Win32API
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
KIV / WIN
■
●
lokální třídy aplikace dostupné pouze v modulu, který je vytvořil ■ rušeny automaticky po uzavření modulu ■
Win32API
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 Win32API ■ identifikátor ovládacího prvku ■ titulek okna: FindWindow
KIV / WIN
■
Win32API
6
Okno: Součásti okna ●
vnitřní oblast okna ■ obsahuje zpravidla ovládací prvky ■ cíl pro vykreslování ■
●
klientská oblast
standardní součásti okna
klientská část
neklientská část zbylá oblast okna ■ title bar, menu bar, rámeček, atd. ■ lze kreslit: viz uživatelské prvky v titulku
KIV / WIN
■
●
rozměry standardních částí okna ■
GetSystemMetrics
Win32API
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:
■
KIV / WIN
●
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 ■
Win32API
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
KIV / WIN
●
desktop: pracovní plocha GetDesktopWindow ■ užití: screenshot ■
– nelze
Win32API
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
■
– pouze
●
dialogy
default standardně předvolený prvek (dialogy) ■ reakce na klávesy <enter>, <esc>
KIV / WIN
■
Win32API
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í
KIV / WIN
●
sady stylů o _EX_
zrušení okna indikováno zprávou WM_DESTROY ■ nikdy neposílat zprávu přímo ■ DestroyWindow ■
Win32API
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
KIV / WIN
■
– též
nastavení uživatelských dat: 32-bitové číslo – užití: dodatečné informace pro MDI okno
Win32API
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
KIV / WIN
■
– první
okno ze skupiny: WS_GROUP – následující po posledním: WS_GROUP ■
WS_TABSTOP: změna focusu tabulátorem – pořadí
Win32API
přepínání dáno pořadím vytváření 13
Okno: Významné rozšířující styly ●
WS_EX_MDICHILD ■
●
WS_EX_TOOLWINDOW ■
●
KIV / WIN
owned okénko se zůženým title barem
WS_EX_TOPMOST ■
●
MDIChild okénko
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 ■
Win32API
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
KIV / WIN
●
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 Win32API
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
KIV / WIN
■
●
subclassing ■
podstrčení vlastní okenní funkce oknu
Win32API
16
KIV / WIN
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); }
Win32API
17
SDI × MDI Aplikace SDI jedno okno jeden dokument ■ viz Notepad ■ ●
Child okno
MDI – správa
KIV / WIN
MDIChild oken – správa „Window“ podmenu
MDIChild okno
■
MDICLIENT
Frame okno
jedno okno více dokumentů ■ okno MDICLIENT třídy ■
Frame okno
●
MDI child okno – vytvoření,
ovládání a zrušení: WM_MDI* zprávy MDICLIENT oknu
■
nezpracované zprávy: speciální funkce
Win32API
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í
KIV / WIN
■
– dealokace
alokovaných zdrojů – uzavření aplikace: PostQuitMessage Win32API
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
KIV / WIN
●
WM_QUIT ukončení smyčky zpráv ■ nezpracovává se ■
– smyčka
Win32API
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
KIV / WIN
– 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 Win32API
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
KIV / WIN
■ ●
neklientská část: WM_NCPAINT
WM_ERASEBKGND žádost na vymazání klientské oblasti ■ původce problikávání při překreslování ■
Win32API
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_*
KIV / WIN
■ ●
WM_GETMINMAXINFO požadavek na informaci o rozměrech okna ■ užití: omezení max./min. rozměrů okna ■
Win32API
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í:
■
makra: zpravidla zpráva + konverze dat – pojmenování:
KIV / WIN
■ ●
ZkratkaPrvkuM_Operace NázevPrvku_Operace
speciální funkce API
fonty: implicitně systémové nastavení: WM_SETFONT ■ dialogy: součást definice dialogu ■
Win32API
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
KIV / WIN
■
– žádný
nebo 'M': ovládání okenní zprávou – 'N': oznámení okenní zprávou pro WM_NOTIFY – 'S': styl okna pro CreateWindow Win32API
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
KIV / WIN
■
●
užití organizace plochy ■ seskupení ovládacích prvků ■
Win32API
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
KIV / WIN
■
Win32API
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í
KIV / WIN
– visuální
rozdělení plochy – seskupení ovládacích prvků ■
bez stavů – podobné
■
statickému, ale s popiskem
specifikováno stylem BS_GROUPBOX
Win32API
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í
■
výběru oblasti řetězce – podpora
KIV / WIN
■
pro práci s clipboardem
zakrytí obsahu (heslo): ES_PASSWORD – implicitně:
■ ●
o dosažení maxima: EN_MAXTEXT
'*', ale možnost změny
podpory pro vrácení změny: EM_UNDO
okenní třída: "Edit" Win32API
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 KIV / WIN
●
■
selected item – vybraná
■
položka(ky)
focused item – cílová
Win32API
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
KIV / WIN
■
vyskakovací bez editace – CBS_DROPDOWNLIST
■
jednoduchý s možností editace – CBS_SIMPLE – edit
Win32API
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
KIV / WIN
– programově
skrytím okna – velikost jezdce > délka dráhy ■
nastavení základních vlastností – pozice
jezdce: SetScrollPos – parametry dráhy: SetScrollRange Win32API
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)
KIV / WIN
■
– podpora
■
pro vrácení vrácení změny: EM_REDO
"RichEdit30W" (rich edit 3.0) – podpora
Win32API
pro dělení slov a změnu měřítka 33
MFC ●
okenní třída: viz Win32API ■
●
registrace: AfxRegisterWndClass
základní okno: potomek CWnd vytvoření viz Win32API: Create ■ připojení na existující handle okna: Attach ■ handle na okno: GetSafeHwnd / m_hWnd ■
●
okno rámce: potomek CFrameWnd
KIV / WIN
■
užití: hlavní okno aplikace – mechanizmus
■
Doc/View
možnost vytvoření + nastavení z resources – natažení
MFC
menu, titulku a ikony: LoadFrame 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
KIV / WIN
●
■
inicializace před první užitím: AfxInitRichEdit
MFC
35
Pokračování příště… děkuji za pozornost ● příště ●
■
KIV / WIN
●
GUI ve Win32API a MFC II
nezapomeňte nakrmit tygry
36