Dialogy

Transkript

Dialogy
Přednáška č. 10
IRAE 07/08
Dialogy
pro komunikaci s uživatelem – nastavení většího množství hodnot najednou
o hostí ovládací prvky
speciální případ okna (z pohledu OS Windows) – v .NET shodné s běžným
formulářem
základní vlastnosti:
o zpravidla neměnná velikost
o implicitní reakce na klávesy (ENTER, ESC)
o modální x nemodální dialog
chování vůči vlastníkovi:
o aplikačně modální – zákaz vlastníka (většina dialogů)
o systémově modální – vždy na vrchu
o úkolově modální (task modal) – zákaz všech top-level oken daného vlákna
Vlastní dialogy
Vytvoření
v .NET shodné s běžným formulářem
možnosti
o programově
Form dialog = new Form();
 vzhled nepůjde vytvořit v návrháři
o přes návrhář VS2005 – menu Project Add new Item
Vzhled okna – obvykle neměnná velikost, nezobrazuje se v liště úloh
dialog.FormBorderStyle = FormBorderStyle.FixedDialog;
dialog.MaximizeBox = false;
dialog.MinimizeBox = false;
dialog.ShowInTaskbar = false;
spuštění (zobrazení):
o modální: dialog.Show()
o nemodální: dialog.ShowModal()
1
Přednáška č. 10
IRAE 07/08
Přidání ovládacích prvků
jasné, viz cvičení
Kontrola zadaných hodnot
„je ta hodnota > 0?“, „je to telefonní číslo?“
ruční – při zavření dialogu
o něco špatně = stornování zavření dialogu (událost Form.Closing) – viz min.
přednáška
automatická – událost Validating
o zděděna z Control
o vyvolá se při opuštění prvku (ztrátě fokusu)
podrobněji viz cvičení
Vstup a výstup dat
viz cvičení
Ukončení dialogu
Obvyklé možnosti:
o Stiskem OK – uživatel chce nastavené hodnoty použít (provést akci)
o Stiskem Storno – nechce
o Něco jiného (velmi neobvyklé)
Nutno přidat tlačítka „OK“ a „Storno“
Rozeznání způsobu ukončení – metoda ShowModal() vrací DialogResult
enum DialogResult
{
//
Abort,
Cancel,
Ignore,
No,
None,
OK,
Retry,
Yes
}
Tlačítka:
// Zrušit
// Storno
// Ignorovat
// Ne – u MessageBox
// OK
// Znovu
// Ano – u MessageBox
Třída Form – Vlastnost DialogResult DialogResult – před ukončením naplnit podle
tlačítka (OK/Storno)
o Defaultní hodnota None
private void buttonOK_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
this.Close();
// implicitne nastavi DialogResult na DialogResult.Cancel
}
private void buttonStorno_Click(object sender, EventArgs e)
{
this.Close();
2
Přednáška č. 10
IRAE 07/08
}
V nadřazeném formuláři kontrola typu ukončení a akce:
private void buttonNastavData_Click(object sender, EventArgs e)
{
NastavDataDialog dialog = new NastavDataDialog();
DialogResult dr = dialog.ShowDialog();
if (dr == DialogResult.OK)
{
// Akce, vyzvednutí dat
label1.Text = "OK";
}
else
{
// obvykle nic neděláme
label1.Text = "Storno";
}
}
Nedostatky ručního nastavení DialogResult v dialogu dle tlačítka – nefunguje výchozí
chování při stisku kláves ENTER (= tlačítko OK) a ESC (= tlačítko Cancel)
Řešení – Form Vlastnosti:
o AcceptButton – přiřadit referenci na tlačítko OK
o CancelButton – na Cancel
public NastavDataDialog()
{
InitializeComponent();
this.AcceptButton = this.buttonOK;
this.CancelButton = this.buttonStorno;
}


lze udělat pohodlně i v návrháři
v tomto případě události tlačítek není nutné vůbec obsluhovat – tlačítka
získají automaticky požadovanou funkčnost
Běžné dialogy
uživatel je zná a očekává
v .NET předpřipraveny jako třídy
princip práce – stejný jako u normálního dialogu:
o pouze není nutno vytvářet
Dialogy:
o
o
o
o
o
o
o
o
ColorDialog
OpenFileDialog
SaveFileDialog
FolderBrowserDialog
FontDialog
PageSetupDialog
PrintDialog
PrintPreviewDialog
3
Přednáška č. 10
IRAE 07/08
Příklad – OpenFileDialog
Metody
o DialogResult ShowDialog() zobrazí dialog
Vlastnosti:
o string FileName (Get, Set) – cesta + jméno souboru („Název souboru:“)
o string Filter (Get, Set) – filtr pro výběr souborů („Soubory typu:“)
 Příklad: "Text files (*.txt)|*.txt|All files (*.*)|*.*"
o string Title (Get, Set) – titulek dialogu (Otevřít)
o string InitialDirectory (Get, Set) – Adresář po zobrazení dialogu
Lze vybrat více souborů najednou – Vlastnosti:
o bool Multiselect (Get, Set) – povolení výběru více souborů
o string[] FileNames (Get, Set) – cesty + jména souborů, Length = počet
vybraných souborů
Reakce na výběr neexistujícího souboru (uživatel zadá jméno ručně), kontrola:
o ručně přes System.IO.File.Exists()
o automaticky (zobrazí varování) – bool CheckFileExists (defaultně true)
Příklad:
OpenFileDialog opf = new OpenFileDialog();
opf.Filter = "Textové soubory (*.txt)|*.txt|Všechny soubory (*.*)|*.*";
opf.InitialDirectory =
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
// cesta k adresari "Dokumenty"
DialogResult dr = opf.ShowDialog();
if (dr == DialogResult.OK)
{
4
Přednáška č. 10
IRAE 07/08
// uzivatel stiskl OK, nebo Enter
// vyzvedneme si jmeno + cestu k souboru
string soubor = opf.FileName;
}
Grafika v .NET
= vytváření grafických obrazců na formulářích
Filosofie kreslení ve Windows
GDI
Aplikace
Device
Context
Device
Driver
GDI = Graphics Driver Interface
o = API pro kreslení
Kreslení je nezávislé na výstupním zařízení:
o Obrazovka
o Paměť
o Tiskárna
o …
GDI+ = vylepšené GDI pro Windows XP a novější
o Přístupné v .NET přes třídy ve jmenných prostorech:
System.Drawing
System.Drawing.Drawing2D
System.Drawing.Imaging
System.Drawing.Text
System.Drawing.Printing
Chci kreslit = nutno požádat Windows o Device Context (DC, kontext zařízení)
o Windows vytvoří dle možností zařízení (rozměry, rozlišení, barevná hloubka,
možnosti ovladače…)
o DC v .NET – reprezentován objektem třídy System.Drawing.Graphics =
virtuální plátno
Objekt třídy Graphics nelze libovolně vytvořit – nutno jej získat, možnosti:
o Voláním Control.CreateGraphics() – přímé kreslení
o Obsluhou události Control.Paint
Princip 2D kreslení v .NET:
o Grafická primitiva: Color, Pen (štětec), Brush (výplň), Color (barvy),
Rectangle (obdélník – pozice a tvar), …
o Nástroje pro kreslení: DrawLine(), DrawRectangle(), DrawString(),
FillRectangle()…
 Používají grafická primitiva
5
Přednáška č. 10
IRAE 07/08
Přímé kreslení
Postup:
o Získání DC
o Kreslení
o Navrácení zpět DC Windows (nutné‼!)
Příklad:
private void buttonKresli_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
// 1) Graphics získán od Form - this
try
{
Brush b = new SolidBrush(Color.Red);
g.FillRectangle(b, 0, 0, 50, 50);
// 2) pouziti
}
finally
{
g.Dispose();
// 3) vraceni, nutne
}
}
Lepší:
private void buttonKresli_Click(object sender, EventArgs e)
{
using (Graphics g = this.CreateGraphics())
{
Brush b = new SolidBrush(Color.Red);
g.FillRectangle(b, 0, 0, 50, 50);
Dispose() zajistí „}” příkazu „using“
}
}
Výsledek:
Ale pozor:
6
Přednáška č. 10
IRAE 07/08
Činnost Windows při kresleni
Skrytí (časti) okna – nutno jej opět obnovit:
o Ovládací prvky, Titulkový pruh, … – obnoví Windows
o Grafické objekty z Graphics musí obnovit programátor
Událost Paint – zapouzdřuje zprávu WM_PAINT – zaslána aplikaci při požadavku
Windows na obnovu vzhledu aplikace
Kreslení v události Paint
Graphics je již vytvořen
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Brush b = new SolidBrush(Color.Red);
g.FillRectangle(b, 0, 0, 50, 50);
}
Žádné Dispose() – Graphics nebyl vytvořen námi ‼!
Problém – vykresleno ihned po startu, nikoli na stisk tlačítka. Řešení:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool vykreslit = false;
private void buttonKresli_Click(object sender, EventArgs e)
{
vykreslit = true;
this.Invalidate(true);
// reakce – Win zaslou WM_Paint
// true – budou překresleny i podřízené prvky
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (vykreslit)
{
Graphics g = e.Graphics;
Brush b = new SolidBrush(Color.Red);
g.FillRectangle(b, 0, 0, 50, 50);
}
}
}
Obsluhujeme Paint vždy toho prvku, na který chceme kreslit‼!
o Kreslení na tlačítko = Paint tlačítka, nikoli Form1
Cíle kreslení
Objekt Graphics dovolí kreslit jen na Client Area prvku, od kterého byl získán
7
Přednáška č. 10
IRAE 07/08
Kreslit lze na cokoli – Graphics pochází z Control (= kořen hierarchie prvků GUI)
private void buttonKresli_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics; // g patří buttonKresli!!!
Pen p = new Pen(Color.Blue, 3);
g.DrawEllipse(p, 0, 0, 70, 40);
}
Činnost Windows při kresleni II
Problém při změně velikosti okna
o Windows překreslí jen to, co musí
o Řešení:
public Form1()
{
InitializeComponent();
this.SetStyle(ControlStyles.ResizeRedraw, true);
// Windows překreslí při změně velikosti vše
}
Problém blikání obrazu:
o Velký počet objektů k vykreslování – obraz bliká
o Řešení = tzv. Double bufferring
 Vykreslení obrazu nejprve do paměti
 Celý obraz najednou na obrazovku
public Form1()
{
InitializeComponent();
// double buffering
this.DoubleBuffered = true;
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
8
Přednáška č. 10
IRAE 07/08
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
}
9

Podobné dokumenty

Objektov↓ orientovan← programov£n

Objektov↓ orientovan← programov£n Tak jak se Vám líbí Vaše nové barevné okénko? Hezké, že? Nebo máte raději jinou barvu? Zkuste si vzpomenout na Vaše začátky angličtiny (Red, Blue, Yellow… ) a vyberte si barvu dle vlastních předsta...

Více

ICT PODPORA VÝUKY SIMULACÍ: MODEL ZÁSOB

ICT PODPORA VÝUKY SIMULACÍ: MODEL ZÁSOB public static (void) Main(). Podrobný popis uvedených i dalších modifikátorů lze nalézt v literatuře [7] nebo na internetových stránkách společnosti Microsoft. Metody zajišťují funkčnost třídy, obs...

Více

Metodika výuky programování - PROŠ

Metodika výuky programování - PROŠ Všechny uvedené typy didaktické techniky mají svoje nezastupitelné místo ve škole. Některé z nich se již možná zdají zastaralé, nicméně jejich vhodné použití přináší celou řadu pozitivních podnětů....

Více

sr_pg_314

sr_pg_314 V tomto kódu se definuje metoda Main – vstupní bod každého programu v jazyce C#. Její první příkaz je ten, který program vykoná po spuštění. Metoda Application.Run

Více

Používáme Visual Studio

Používáme Visual Studio solver.GenerateRandom(1); textBoxa.Text = solver.A.ToString(); textBoxb.Text = solver.B.ToString(); textBoxc.Text = solver.C.ToString(); textBoxx1.Text = solver.x1; textBoxx2.Text = solver.x2;

Více

Programy pro OS Windows

Programy pro OS Windows Application.Run(okno);

Více

sr_pg_308

sr_pg_308 Pro provozní dobu tří benzínových stanic A, B, C v určitém městě platí tyto podmínky: Vždy je v provozu stanice A nebo C. Stanice C je mimo provoz, právě když je otevřeno ve stanici A. Jakmile je o...

Více