KIV / WIN
Dialogy a základy GUI pro .NET
VI
Obsah uživatelem definované dialogy ● standardní dialogy a dialogy shellu ● základy GUI v .NETu
KIV / WIN
●
2
Dialogy speciální případ okna ● komunikace s uživatelem ● základní vlastnosti ●
zpravidla neměnná velikost ■ implicitní reakce na klávesy ■ modální × nemodální dialog ■ generování speciálních zpráv ■
KIV / WIN
●
funkcionalita dialogu: dodaná funkce parametry shodné s WindowProc ■ implicitní obsluha zpráv: DefDlgProc ■
– možno
Win32API
použít DefWindowProc 3
Dialogy: Modální dialog ●
aplikace: čekání na návratový kód ■
přebrání kontroly nad smyčkou zpráv – některé
●
zprávy přeposílány vlastníku
chování vůči vlastníku (okno) ■
aplikačně modální: zakázání vlastníka – většina
dialogů
systémově modální: vždy na vrchu ■ úkolově modální (task modal)
KIV / WIN
■
– zakázaní ●
všech top-level oken daného vlákna
operace vytvoření a spuštění: DialogBox* ■ ukončení: EndDialog ■
Win32API
4
Dialogy: Nemodální dialog podobné obyčejnému oknu ● nutno modifikovat smyčku zpráv ●
■
generování speciálních zpráv dialogu – IsDialogMessage – reakce
na dialogové klávesy – inicializace dialogu ●
operace vytvoření: CreateDialog* ■ spuštění: ShowWindow ■ uzavření dialogu
KIV / WIN
■
– zpravidla:
uzavření = skrytí dialogu – nutno explicitně zrušit: DestroyWindow Win32API
5
Dialogy: Styly dialogu ●
upravují chování dialogu ■
DS_CONTROL: povolení dialogu jako child – nutné
■
po použití v property pages
DS_CONTEXTHELP: kontextová nápověda – podmíněno:
WS_EX_CONTEXTHELP – generuje WM_HELP ■
DS_SETFONT fontu dle definice dialogu – povolení generování WM_SETFONT
KIV / WIN
– nastaví ●
upravují vytváření dialogu DS_CENTER: vycentrování okna dialogu ■ DS_CENTERMOUSE: vycentrování kurzoru ■
Win32API
6
Dialogy: Zprávy dialogu zpracovány dialogovou funkcí ● WM_INITDIALOG ●
nastavení ovládacích prvků ■ možno předat data při vytvoření ■
WM_SETFONT: nastavení fontu ● WM_CANCELMODE ●
KIV / WIN
■ ●
žádost o uvolnění myši vlastníkem
WM_HELP: kontextová nápověda ■
reakce na – klávesu
: ovládací prvku s focusem – dotazovací kurzor: vybraný ovládací prvek Win32API
7
Dialogy: Definice dialogu ●
resources vytvořeno zpravidla před překladem ■ strukturovaný popis dialogu: textová podoba ■
– zpravidla
návrh pomocí různých editorů
kompilace do binární podoby: resources ■ funkce: *Param (DialogBoxParam) ■ ●
programově vytvoření struktury podobné resources ■ struktury
KIV / WIN
■
– DLGTEMPLATE – DLGITEMTEMPLATE
■
funkce: *Indirect (DialogBoxIndirect)
Win32API
8
Dialogy: Ovládací prvky ●
nutno identifikovat unikátním ID užito pro práci s ovládacími prvky ■ převod ID ↔ handle ovládacího prvku ■
– funkce ●
GetDlgCtrlID / GetDlgItem
hodnota ovládacího prvku ■
celočíselná hodnota textu ovládacího prvku info o úspěšnosti (neúspěch: nula) – funkce GetDlgItemInt / SetDlgItemInt
KIV / WIN
– vrací:
■
text ovládacího prvku – funkce
■
GetDlgItemText / SetDlgItemText
blokující vyslání zprávy ovládacímu prvku – funkce
Win32API
SendDlgItemMessage 9
Dialog × MFC I potomek třídy CDialog ● definice dialogu: resources ● spuštění dialogu ●
modální: DoModal ■ nemodální: Create ■ ●
ukončení dialogu
KIV / WIN
■
modální: EndDialog – voláno
■
defaultní implementací OnOK/OnCancel
nemodální: viz okno – OnClose:
implicitně ruší okno, nikoliv objekt – zrušení objektu nutno přidat do PostNcDestroy MFC
10
Dialog × MFC: Standardní události ●
počáteční nastavení: OnInitDialog voláno před prvním zobrazením ■ obdoba WM_INITDIALOG ■ možnost určit počáteční focus ■
●
tlačítko IDOK: OnOK ■
KIV / WIN
●
přetěžováno pro nemodální dialogy
tlačítko IDCANCEL: OnCancel
MFC
11
Dialog × MFC: Přístup na data I ●
základní: GetDlgItem ■
●
viz Win32
DDX: Dialog Data Exchange ■
data a ovládací prvky: atributy třídy – ovládací
■
prvky: instance patřičných tříd
aplikace dat na ovládací prvky: UpdateData
KIV / WIN
– určení
směru předání dat: do/z ovl. prvku – voláno standardní implementací OnInitDialog – modální: před návratem z DoModal ■
přenos dat: DoDataExchange – přenos
MFC
dat: funkce DDX_* 12
Dialog × MFC: Přístup na data II ●
DDV: Dialog Data Validation ■
kontrola správnosti dat – délka
řetězce: DDV_MinMax* – rozsah číselné hodnoty: DDV_MaxChars ■
oznámení chyby: CDataExchange::Fail focusu na ovládací prvek s chybou – vyhození výjimky: CUserException – zachycení: zobrazení message boxu
KIV / WIN
– nastavení
MFC
13
CommonDialogs vždy modální s jednou výjimkou ● vlastní obsluha (funkce) dialogu ● vstup dialogu: struktura ●
nutno nastavit velikost struktury: lStructSize ■ nutno nastavit příznaky: Flags ■
– ovlivnění ●
návratové hodnota ■
KIV / WIN
schopností a složek struktury
TRUE: uživatel zvolil tlačítko OK – hodnoty
■
dialogu: předaná struktura
FALSE: uživatel dialog zrušil – selhání
Win32API
dialogu: chyba CommDlgExtendedError 14
CommonDialogs: Souborové ●
soubor pro vstup kontrola existence vybrané cesty ■ výběr více souborů ■ funkce GetOpenFileName ■
●
soubor pro výstup
KIV / WIN
■
možnost – kontroly
na existenci vybrané cesty a souboru – dotazu, zda soubor přepsat ■
funkce GetSaveFileName
Win32API
15
CommonDialogs: Vzhledové ●
výběr barvy určení vybrané barvy ■ určení volitelných barev ■ zamezení vytvoření vlastní barvy ■ funkce ChooseColor ■
●
výběr písma výběr fontů dostupných na zařízení dle DC ■ vrací: LOGFONT ■ funkce ChooseFont
KIV / WIN
■
Win32API
16
CommonDialogs: Textové ●
nemodální návratová hodnota: handle okna dialogu ■ vysílá zprávu vlastníkovi ■
– ID
zprávy: nutno zjistit RegisterWindowMessage(FINDMSGSTRING)
●
reakce na zadání vyhledání / nahrazení ■ uzavření dialogu
KIV / WIN
■ ●
funkce FindText / ReplaceText
Win32API
17
CommonDialogs: Tiskové ●
nastavení tisku ■
výběr – tiskárny – stránek
pro tisk – počet kopií ■ ●
funkce PrintDlg
nastavení stránky tiskárny pro výstup ■ okrajů stránky
KIV / WIN
■
– jednotky:
milimetry, palce – dle nastavení systému ■
funkce PageSetupDlg
Win32API
18
Další dialogy: Výběr adresáře ●
vrací strukturu identifikátoru adresáře nutno přeložit: SHGetPathFromIDList ■ nutno explicitně dealokovat ■
– rozrhanní
■
IMalloc: SHGetMalloc
možnost – filtrovat
adresáře (WinXP) – vytvářet adresáře
funkce SHBrowseForFolder ● nutné
KIV / WIN
●
■
shlobj.h, shell32.lib
Win32API
19
Okno okno = třída ● System.Windows.Forms ●
■
Control – základní
třída pro všechna okna – specializace: jednotlivé ovládací prvky ■
UserControl – určeno
KIV / WIN
■
pro vytváření vlastních ovládacích prvků
Form – samostatné
okno – zpravidla hlavní okno aplikace – též funkcionalita dialogu .NET
20
Okno: Události zpráva = vyvolání události ● obsluha události ●
■ ●
okno neobsluhuje jiné události
vytvoření obsluhy ■
registrování události – doporučený
způsob – parametry: původce + parametr dle události
KIV / WIN
■
přetížení funkce On– nedoporučený
způsob – vhodné pro odstínění události – vhodné zavolat implementaci v předku – nevyvolání: nevygenerování události .NET
21
Okno: Smyčka událostí ●
standardní metoda Application.Run ■ forma nemusí být viditelná ■ ukončení ■
– uzavření
hlavního okna – Application.Exit
KIV / WIN
●
idle ■ nahrazení části metody Run MyForm form = new MyForm(); form.Show(); while (form.Created) { form.DoSomethingUseful(); Application.DoEvents(); }
.NET
22
Okno: Vytvoření okna ●
vytvoření instance třídy ■
konstruktor třídy – vytvoření
potomků – registrace událostí ■ ●
vhodné blokovat událost změny rozložení
první zobrazení okna dodatečné nastavení okna ■ událost Load
KIV / WIN
■ ●
detekce vytvořeného okna ■
property Created
.NET
23
Okno: Zrušení okna ●
události uzavření okna ■
požadavek na uzavření – lze
odmítnout – užití: otázka „Are you sure?“ – událost Closing ■
oznámení o uzavření – okno
nelze přímo obnovit – událost Closed
KIV / WIN
■ ●
nevyvoláno při Application.Exit
programově běžné okno: funkce Close ■ znovupoužitelná okna: skrytí okna (Hide) ■
.NET
24
Okno: Vztahy mezi okny ●
rodič-potomek ovládací prvky ■ nastavováno automaticky ■ rodič: property Parent ■ potomci: Controls ■
– užití:
■
přidávání ovládacích prvků
hlavní okno: nevyšší rodič – property
KIV / WIN
●
TopLevelControl
vlastník-vlastněný dialogy ■ property Owner / OwnedForms ■
.NET
25
Okno: Základní vlastnosti aplikováno zpravidla na potomky ● generují patřičnou událost (event) ●
■
možnost dvojce událostí: před a po – před:
možnost odmítnutí operace
povolení okna: Enabled ● zobrazení okna: Visible ●
KIV / WIN
■ ●
aktivace okna: Select ■
●
též Show/Hide přesunutí do popředí a získání focusu
titulek okna: Text .NET
26
Okno: Rozmístění potomků ●
automaticky ■
zamknutí okraje vzhledem k okraji rodiče – property
Anchor – možné kombinace okrajů ■
přilepení k okraji: nelze kombinovat – property
Dock – dle hloubky (z-order) ●
ručně: událost Layout nastavení ovladacích prvků ■ reakce na událost Resize ■ změna: vhodné zamezit obsluhu
KIV / WIN
■
– SuspendLayout
.NET
/ ResumeLayout 27
Okno: Pozice změna: událost ● nastavení okrajů okna ●
■ ●
levý horní roh: Location ■
●
property Bounds možno užít též pro počáteční pozici
počáteční pozice property StartPosition ■ zpravidla pro dialogy ■ aplikace: při zobrazení ■ automaticky × ručně (Location)
KIV / WIN
■
.NET
28
Okno: Velikost velikost okna: Size ● velikost klientí plochy: ClientSize ●
■ ●
detekce změny velikosti: Resize ■
●
KIV / WIN
generuje požadavek na změnu rozložení
maximální rozměry okna ■
●
volá SetClientSizeCore: lze přetížit
MinimumSize / MaximumSize
stav okna: WindowState ■
maximalizace/minimalizace
.NET
29
Okno: Vzhled I ●
barva: Fore/BackColor ovlivňuje vykreslování všech potomků ■ systémové barvy: struktura SystemColors ■
●
nastavení okraje: FormBorderStyle ovlivňuje schopnost měnit velikost ■ možnost zakázání okraje ■
●
pořadí hloubky primárně: dle pořadí přidávání ■ změna za běhu: BringToFront / SendToBack ■ vždy v popředí: TopMost
KIV / WIN
■
.NET
30
Okno: Vzhled II ●
uživatelský tvar okna ■
možno nastavit libovolný tvar: Region – vytvořeno
■
možno zprůhlednit části: TransparencyKey – průhledná
■ ●
složením křivek barva: bez reakce na myš
průsvitnost okna: Opacity
podpora pro témata implicitně: standardní Win2k vzhled ■ povolení: Application.EnableVisualStyles
KIV / WIN
■ ●
zobrazení v liště: ShowInTaskBar ■
vhodné pro dialogy
.NET
31
Okno: Focus implicitní uživatelský vstup ● zjištění focusu ●
daného okna: Focused ■ včetně potomků: ContainsFocus ■ ●
nastavení focusu ■
uživatele na : property TabStop – pořadí reakce na : property TabIndex
KIV / WIN
– reakce
■
programově – funkce
Focus – úspěch nemusí být automatický ■
událost: GotFocus / LostFocus
.NET
32
Pokračování příště... děkuji za pozornost ● příště ●
■
KIV / WIN
●
grafický výstup
nezapomeňte nakrmit ryběnky
33