Formuláře. Takto se zobrazí modálně: void button1_click(object sender, System.EventArgs e) { JinyFormular formular = new JinyFormular()



Podobné dokumenty
01. HODINA. 1.1 Spuštění programu VB Prvky integrovaného vývojového prostředí. - pomocí ikony, z menu Start.

zapište obslužnou metodu události Click tlačítka a vyzkoušejte chování polevýsledek.text = polečíslo1.text + polečíslo2.text;

František Hudek. březen ročník

Úvodní příručka. Získání nápovědy Kliknutím na otazník přejděte na obsah nápovědy.

Metodický list k didaktickému materiálu

8. OKNA 73. obr. 1 Roletové menu "Okna"

Popis ovládání aplikace - Mapový klient KÚPK

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Prostředí Microstationu a jeho nastavení. Nastavení výkresu

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Nápověda k používání mapové aplikace Katastrální mapy Obsah

Generické programování

Popis rozšířujících funkcí JScriptu

Podmíněné vykonávání

GEOM LITE - MANUÁL hlavní obrazovka

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Manuál k ovládání aplikace INFOwin.

Individuální nastavení počítače

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Nejzajímavější jsou události MouseDown a KeyDown.

Dialogy a základy GUI pro.net KIV / WIN

Možnosti programu. KAPITOLA 5 Možnosti

Takto chápanému druhu objektů se říká TŘÍDA.

VY_32_INOVACE_INF.08. Microsoft Windows II.

Nástroje v InDesignu. Panel nástrojů 1. část. Nástroje otevřeme Okna Nástroje

PŘETĚŽOVÁNÍ OPERÁTORŮ

Kanboard Documentation. The Kanboard Authors

Windows - základy. Hlavním vypínačem na základní jednotce. K datům uloženým do výchozí složky.

Př. program s popojíždějícím autíčkem o 50 pixelů při každém stisku Popojeď

z aplikace Access 2003

Důležité informace o produktu

Pracovní prostředí Word 2003 versus Word 2010

Používání u a Internetu

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Objekty jako zapozdření dat. začneme vytvářet vlastní objekty a třídy

Začínáme pracovat s tabulkovým procesorem MS Excel

MIDAM Simulátor Verze 1.5

AutoCAD nastavení výkresu

Pokyny pro žáky k testování písemné zkoušky na počítači

Celkové množství uzavřených peněz na trhu. Počet vítězů. Počet výběrů zobrazených v Gridu. Celkový počet výběrů v trhu

Závěrečná práce. AutoCAD Inventor (Zadání D1)

InsideBusiness Payments CEE

Formuláře. Téma 3.2. Řešený příklad č Zadání: V databázi formulare_a_sestavy.accdb vytvořte formulář pro tabulku student.

PREPROCESOR POKRAČOVÁNÍ

Cvičné příklady Tematický celek 01

Práce s oknem, nastavení

Migrace na aplikaci Outlook 2010

Ovládání Open Office.org Calc Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako.

Spuštění a ukončení databázové aplikace Access

Vektorizace obrázků. Co se naučíte. Vítá vás aplikace CorelDRAW, komplexní profesionální program pro grafický návrh a práci s vektorovou grafikou.

Pro správné zobrazení mapové aplikace je potřeba mít nainstalovaný zásuvný modul Flash Adobe Player.

Aktuální výběr, nad kterým je kurzor myši

Použití filtrů v Museionu

Indexové seznamy. známe už pole, kde ale musí být předem známa velikost indexové seznamy umí růst dynamicky

-menu: dává přístup k funkcím programu. v návodech, pokud chceme říct "klikněte na Soubor a pak na volbu Nový", to zapisujeme jako: Soubor / Nový

umenugr JEDNOTKA PRO VYTVÁŘENÍ UŽIVATELSKÝCH GRAFICKÝCH MENU Příručka uživatele a programátora

Průvodce aplikací FS Karta

Nielsen Admosphere, a.s. Vážená domácnosti,

Nejsnazší cesta k půjčení firemního vozu

HELIOS - Zálohování BüroKomplet, s.r.o.

Microsoft Publisher 2013 vypadá jinak než ve starších verzích, proto jsme vytvořili tuto příručku, která vám pomůže se s ním rychle seznámit.

Programování v jazyku C# II. 1.kapitola

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Zobrazování bannerů podporují pouze nově vytvořené šablony motivů vzhledu.

Prezentace. Prezentace. 5. InDesign vzory, znakové styly. Vytvořil: Tomáš Fabián vytvořeno

Helpdesk Univerzity Pardubice Návod pro uživatele

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU

Základní nastavení systému Windows 7

Vizualizace a evidence výroby a prostojů

MS PowerPoint ZÁKLADY

2 Grafický výstup s využitím knihovny

BALISTICKÝ MĚŘICÍ SYSTÉM

Vypracoval: Jiří Němeček, produktový manažer KOPOS KOLÍN a.s. Havlíčkova 432 CZ Kolín a IV. Konfigurátor KNS

Nástroj Setup. Uživatelská příručka

Univerzita Palackého. Pedagogická fakulta

Hledání správné cesty

CORELDRAW SEZNÁMENÍ S PROGRAMEM. Lenka Bednaříková

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Manuál k programu KaraokeEditor

1 Tabulky Příklad 3 Access 2010

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

FORMÁTOVÁNÍ 2. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

3 Formuláře a sestavy Příklad 1 Access 2007

Návod k práci s programem MMPI-2

Postup instalace síťové verze Mount Blue

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

1. Otevřete dokument, který chcete číst. 2. Na kartě Zobrazení klikněte ve skupině Zobrazení dokumentů na položku Čtení na celé obrazovce.

Pracovní prostředí Excel 2010

Uživatelský manuál aplikace. Dental MAXweb

Nastavení přístupových práv terminálů BM-Finger na čipování docházky a otevírání dveří

On-line nápověda časté dotazy V1.2

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

COREL PHOTO-PAINT SEZNÁMENÍ S PROGRAMEM. Lenka Bednaříková

Téma 1: Práce s Desktop. Téma 1: Práce s Desktop

Tisk map z LPIS - rozšířené

VetSoftware.eu V2 Návod pro instalaci vzdálené pomoci verze dokumentu 1.0,

Návod k použití pro uživatele Systému monitoringu návštěvnosti oficiálních turistických informačních center

Digitální učební materiál

Transkript:

2 Formuláře V technologii, která se jmenuje Formuláře Windows WinForms se dá očekávat, že stěžejní roli bude hrát formulář. V této kapitole prozkoumáme základy, tedy jak se formuláře zobrazí, co je to doba života formuláře, velikost a umístění formuláře, neklientské ozdůbky formuláře, nabídky, dceřiné ovládací prvky, ale také vyspělejší témata, jako jsou průhledné formuláře, formuláře, které nemají tvar obdélníka, rozvržení ovládacích prvků, formuláře MDI a vizuální dědění. A aby toho nebylo dost, je celá kapitola 3 věnována používání formulářů jako dialogů. Něco z látky probírané v této kapitole jmenovitě témata týkající se dceřiných ovládacích prvků, jako jsou kotvení a přichycování se stejně dobře jako na formuláře dají aplikovat i na uživatelské ovládací prvky. Přestože je část látky společná oběma tématům, tak věci, které se běžně sdružují s formuláři, se probírají zde, témata spíše sdružovaná s ovládacími prvky se probírají v kapitole 8: Ovládací prvky. Zobrazování formulářů Jakýkoli formulář tj. jakákoli třída, která je odvozená ze základní třídy Form se dá zobrazit jedním ze dvou způsobů. Nemodálně takto: void button1_click(object sender, System.EventArgs e) { JinyFormular formular = new JinyFormular() formular.show(); // Zobrazí formulář nemodálně Takto se zobrazí modálně: void button1_click(object sender, System.EventArgs e) { JinyFormular formular = new JinyFormular() 67

68 Formuláře formular.showdialog(); // Zobrazí formulář modálně Form. Show zobrazí nový formulář nemodálně a vrátí řízení okamžitě, aniž by vytvořila nějaký vztah mezi aktuálně aktivním oknem a novým formulářem. To znamená, že se existující formulář může zavřít, a nový formulář zůstane 1. Naproti tomu Form. ShowDialog zobrazí formulář modálně a nevrátí řízení do té doby, dokud se vytvořený formulář nezavře, buď explicitně metodou Close nebo nastavením vlastnosti DialogResult (více o tom v kapitole 3: Dialogy). Vlastnické a vlastněné formuláře Když metoda ShowDialog zobrazí nový formulář, použije jako logického vlastníka pro nový formulář aktuálně aktivní formulář 2. Vlastník ( owner) je okno, které připívá k chování vlastněného (owned) formuláře. Například, má-li nějaký vlastník modálního potomka, pak se aktivací vlastníka, jako třeba přepnutí pomocí kláves Alt+Tab, aktivuje vlastněný formulář. V nemodálním případě, když je vlastnický formulář minimalizovaný nebo obnovený, bude takový i vlastněný formulář. Dále, vlastněný formulář se vždy zobrazuje před vlastnickým formulářem, i když je aktuálně vlastník aktivní, jako kdyby uživatel klikl na vlastníkovi, viz obrázek 2.1. Obrázek 2.1: Vztah vlastník vlastněný Když se nějaký formulář aktivuje nemodálně, metodou Show, standardně nemá nový formulář vlastníka. Vlastník nemodálního formuláře se nastaví vlastností Owner nového formuláře: void button1_click(object sender, System.EventArgs e) { JinyFormular formular = new JinyFormular() formular.owner = this; // Zřídí vztah vlastník /vlastněný formular.show(); V modálním případě, navzdory implicitnímu vztahu vlastník vlastněný, který WinForms vytvoří, bude mít modální formulář vlastnost Owner nastavenou na null, pokud se nenastaví explicitně.

Formuláře 69 To se dá udělat tak, že nastavíte vlastnost Owner těsně před voláním ShowDialog, nebo když předáte vlastnický formulář jako argument do překryté metody ShowDialog, která přebírá parametr IWin32Window 3 : void button1_click(object sender, System.EventArgs e) { JinyFormular formular = new JinyFormular() formular.showdialog(this); // předá jako argument vlastníka Formulář fungující jako vlastník může projít seznam formulářů, které vlastní, pomocí kolekce OwnedForms: void button1_click(object sender, System.EventArgs e) { JinyFormular formular = new JinyFormular(); formular.owner = this; formular.show(); foreach (Form ownedform in this.ownedforms) { MessageBox.Show(ownedForm.Text); Možná jste si při přidávání nepovinného vlastníka všimli, že formulář také může mít nepovinného rodiče, což je vystaveno vlastností Parent. Normálně mají všechny normální formuláře vždy nastavenou vlastnost Parent na null. Jedinou výjimkou z tohoto pravidla jsou dceřiné formuláře MDI, které budu probírat později. Na rozdíl od vztahu vlastník-vlastněný, diktuje vztah rodič- -potomek, že se bude ořezávat tj. strana potomka bude zarovnaná se stranou rodiče, což vidíte na obrázku 2.2. Vztah rodič-potomek je rezervovaný pro rodičovské formuláře (nebo kontejnerové rodičovské ovládací prvky) a dceřiné ovládací prvky (s výjimkou MDI, což se probírá později). Obrázek 2.2: Dceřiný seznam (ListBox) zarovnaný podle klientské oblasti svého rodičovského formuláře

70 Formuláře Doba života formuláře Třebaže uživatel formulář neuvidí do té doby, dokud se nezavolá Show nebo ShowDialog, existuje formulář od okamžiku, kdy se vytvoří jeho objekt. Nový objekt formuláře se probouzí v konstruktoru objektu, kterého runtime volá, když se objekt vytváří poprvé. Během práce konstruktoru se volá InitializeComponent, a tehdy se vytvářejí a inicializují všechny dceřiné ovládací prvky. Není dobrý nápad strkat svůj vlastní kód do funkce InitializeComponent, protože ho Designér pravděpodobně vyhodí. Chcete-li ale přidávat další ovládací prvky, nebo změnit nějaká nastavení, která připravila InitializeComponent, můžete to udělat v konstruktoru. Jestliže jste si nechali počáteční implementaci formuláře vygenerovat některým z průvodců VS.NET, máte ve vygenerovaném kódu dokonce komentář s pokynem, kam máte vkládat svůj inicializační kód: public Form1() { // Required for Windows Form Designer support InitializeComponent(); // TODO: Add any constructor code after InitializeComponent call // Přidáme nový ovládací prvek Button jinetlacitko = new Button(); this.controls.add(jinetlacitko); // Změníme hodnotu nějaké vlastnosti jinetlacitko.text = "Něco, co není k mání v době návrhu"; Když se zavolá Form.Show nebo Form.ShowDialog, je na formuláři, aby zobrazil sám sebe a všechny své dceřiné ovládací prvky. Chcete-li, můžete si nechat oznámit, že se to stalo, když vhodným způsobem zpracujete událost Load: void InitializeComponent() { this.load += new System.EventHandler(this.Form1_Load); void Form1_Load(object sender, EventArgs e) { MessageBox.Show("Vítejte na formuláři Form1"); Událost Load je prospěšná pro všechny závěrečné inicializace, které se mají udělat těsně předtím, než se formulář zobrazí. Událost Load je také vhodným místem pro změnu vlastností Visible a ShowInTaskbar. Ty se týkají viditelnosti, a hodí se, chcete-li mít na začátku formulář skrytý 4 :

Formuláře 71 void Form1_Load(object sender, EventArgs e) { // nezobrazit formulář this.visible = false; this.showintaskbar = false; Když se formulář zobrazí, stane se aktivním formulářem. Je to aktivní formulář, který obdrží vstup z klávesnice. Neaktivní formulář se zaktivuje tehdy, když na něm uživatel klikne, nebo jinak indikuje systému Windows, že ho chce aktivovat například se do něho přepne pomocí Alt+Tab. Neaktivní formulář můžete také aktivovat programátorsky metodou Form.Activate. 5 Když se formulář učiní aktivním formulářem, včetně situace, kdy se poprvé načítá, obdrží událost Activated: void InitializeComponent() { this.activated += new System.EventHandler(this.Form1_Activated); void Form1_Activated(object sender, System.EventArgs e) { this.game.resume(); Má-li aplikace nějaký formulář, který je právě aktivním oknem z pohledu operačního systému, můžete to odhalit statickou vlastností Form.ActiveForm. Je-li null, znamená to, že žádný z formulářů aplikace není právě aktivní. Chcete-li sledovat deaktivace formuláře, zpracujte událost Deactivate: void InitializeComponent() { this.deactivate += new System.EventHandler(this.Form1_Deactivate); void Form1_Deactivate(object sender, System.EventArgs e) { this.game.pause(); Určovat můžete nejen to, zda má být formulář aktivní nebo ne, můžete také určovat jeho viditelnost. Buď metodami Hide a Show, které nastavují vlastnost Visible, nebo nastavit vlastnost Visible přímo: void hidebutton_click(object sender, System.EventArgs e) { this.hide(); // Nastaví vlastnost Visible nepřímo

72 Formuláře this.visible = false; // Nastaví vlastnost Visible přímo Jak asi očekáváte, existuje také událost, kterou se dají zpracovat situace, kdy formulář mizí z dohledu, nebo se chystá zjevit. Jmenuje se VisibleChanged. Všechny tři události, Activated, Deactivate a VisibleChanged se hodí pro restartování a pozastavování činností, které vyžadují interakci s uživatelem, nebo mají přitáhnout jeho pozornost, což je typické pro hry. Chcete-li činnosti úplně zastavit, zpracovává se buď událost Closing, nebo Closed. Událost Closing lze stornovat, pokud uživatel změní názor na to, co chtěl udělat: void Form1_Closing(object sender, CancelEventArgs e) { DialogResult res = MessageBox.Show( "Ukončit hru?", "Hra běží", MessageBoxButtons.YesNo); e.cancel = (res == DialogResult.No); void Form1_Closed(object sender, EventArgs e) { MessageBox.Show("Hru jste ukončili"); Všimněte si, že během události Closing může zpracovatel nastavit vlastnost CancelEventArgs. Cancel na true, čímž se uzavření formuláře stornuje. Je to také nejlepší místo pro serializaci těch vlastností formuláře, které se týkají jeho vzhledu, například jeho velikosti a umístění, ještě dřív, než Windows formulář zavře. Naproti tomu je událost Closed v podstatě jen oznámení, že formulář už odešel do věčných lovišť. Velikost a pozice formuláře Je pravděpodobné, že během svého života bude formulář zabírat na nějakém místě nějaký prostor. Počáteční pozici formuláře vládne vlastnost StartPosition, která může nabývat jedné z hodnot výčtu FormStartPosition: enum FormStartPosition { CenterParent, CenterScreen, Manual, WindowsDefaultBounds, WindowsDefaultLocation, // výchozí Jednotlivé hodnoty znamenají následující chování: WindowsDefaultLocation. Startovací pozici formuláře určí systém Windows. Pokusí se najít takové místo počínaje od levého horního rohu obrazovky směrem k pravému dolní-

Formuláře 73 mu rohu, aby se nová okna nezakrývala, ani se nedostala mimo obrazovku. Velikost formuláře bude taková, jak byla v Designérovi nastavena vlastnost Size. WindowsDefaultBounds. Žádáte systém Windows, aby určil výchozí velikost i výchozí umístění. CenterScreen. Formulář se umístí do středu plochy (desktop), což je oblast, do které se nepočítá hlavní panel a podobné věci. CenterParent. Když se volala ShowDialog, umístí se formulář se do středu vlastníka (nebo aktuálně aktivního formuláře, není-li žádný vlastník). Jestliže se volala Show, bude chování jako u WindowsDefaultLocation. Manual. Umožňuje nastavit počáteční pozici i velikost formuláře ručně, bez jakýchkoli intervencí ze strany Windows. Velikost a pozice formuláře jsou vystavené přes vlastnosti Size a Location, které jsou typu Size, resp. Point (obě ze jmenného prostoru System.Drawing). Vlastnosti určující velikost formuláře jsou také pro větší pohodlí vystaveny přes vlastnosti formuláře Height a Width (výška a šířka), vlastnosti určující pozici přes vlastnosti formuláře Left, Right, Top a Bottom (vlevo, vpravo, nahoře a dole). Základní vlastnosti formuláře pro velikost a pozici vidíte na obrázku 2.3. Obrázek 2.3: Vlastnosti DesktopLocation, Location, ClientSize a Size Když se změní levý horní roh formuláře, je to posun, který se dá zpracovat ve zpracovateli událostí Move nebo LocationChanged. Když se změní výška nebo šířka formuláře, což je změna velikosti, dá se to zpracovat ve zpracovateli událostí Resize nebo SizeChanged 6. Někdy stačí jediný pohyb myší, aby nastaly všechny události týkající se posunu a změny velikosti. Například, když změníte velikost formuláře tak, že táhnete jeho levý horní roh, měníte zároveň jeho velikost i pozici. Pozice formuláře je v absolutních souřadnicích obrazovky. Zajímáte-li se o relativní souřadnice formuláře vzhledem k ploše (desktop) aby se, například, titulkový pruh vašeho formuláře nikdy nedostal za hlavní panel, (a byl jím tedy zakrytý) ani když je hlavní panel Windows nahoře, jak to vidíte na obrázku 2.3, využijte vlastnost DesktopLocation. Ukázka:

74 Formuláře private void Form1_Load(object sender, System.EventArgs e) { // Může skončit za hlavním panelem this.location = new Point(1, 1); // Vždy bude na ploše this.desktoplocation = new Point(1, 1); // Jednodušší zápis předchozího řádku this.setdesktoplocation(1, 1); Pozice se vyjadřují pomocí struktury Point ze jmenného prostoru System. Drawing, jejíž zajímavé části jsou uvedeny zde: struct Point { // členské proměnné public static readonly Point Empty; // konstruktory public Point(int x, int y); // vlastnosti public bool IsEmpty { get; public int X { get; set; public int Y { get; set; // metody public static Point Ceiling(PointF value); public void Offset(int dx, int dy); public static Point Round(PointF value); public virtual string ToString(); public static Point Truncate(PointF value); Struktura PointF je velmi podobná struktuře Point, používá se ale v kreslicích aplikacích, v nichž se požaduje přesnější měření v pohyblivé řádové čárce. Tu a tam budete potřebovat převádět z Point na objekt PointF, abyste mohli volat některé metody nebo nastavit některé vlastnosti. Dá se to udělat celkem bez námahy: // Dá se přímo převádět z Point do PointF: Point pt1 = new Point(10, 20); PointF pt2 = pt1; // vede na PointF(10.0f, 20.0f)

Formuláře 75 Protože však čísla v pohyblivé řádové čárce obsahují přesnost navíc (ta se při konverzi ztratí), musíte při převodu PointF na objekt Point explicitně říct, jak se to má udělat, a to pomocí statických metod Truncate, Round, nebo Ceiling třídy Point: // Musíte být explicitní, převádíte-li z PointF do Point: PointF pt1 = PointF(1.2f, 1.8f); Point pt2 = Point.Truncate(pt1); // vede na Point(1,1); Point pt3 = Point.Round(pt1); // vede na Point(1,2); Point pt4 = Point.Ceiling(pt1); // vede na Point(2,2); Velikost okna se odráží ve vlastnosti Size, která pochází také ze System.Drawing (Size má také protějšek SizeF, a poskytuje stejné schopnosti pro konverze): struct Size { // členské proměnné public static readonly Size Empty; // konstruktory public Size(int width, int height); // vlastnosti public int Height { get; set; public bool IsEmpty { get; public int Width { get; set; // metody public static Size Ceiling(SizeF value); public virtual bool Equals(object obj); public static Size Round(SizeF value); public virtual string ToString(); public static Size Truncate(SizeF value); Přestože vlastnost Size reprezentuje velikost celého okna, není formulář zodpovědný za realizaci veškerého svého obsahu. Formulář může mít ohraničení, titulkový pruh, posuvníky, a to vše kreslí Windows. Část formuláře, za kterou je zodpovědný formulář, je klientská oblast, vyjadřovaná vlastností ClientSize, která je znázorněná na obrázku 2.3. Je docela vhodné ukládat si vlastnost ClientSize mezi sezeními aplikace, protože je nezávislá na aktuálních nastaveních různých ozdůbek, které si zřídil uživatel. Obdobně, když měníte velikost formuláře tak, aby bylo zajištěno dost místa pro realizace celého formuláře, často se to zařizuje na základě klientské oblasti formuláře, ne jeho kompletní velikosti: private void Form1_Load(object sender, System.EventArgs e) { this.clientsize = new Size(100,100); // Zavolá SetClientSizeCore

76 Formuláře this.setclientsizecore(100, 100); Rectangle ( obdélník) kombinuje Point a Size a má také protějšek RectangleF. Obdélník formuláře pro okna nejvyšší úrovně (ne pro dceřiná okna) relativně k obrazovce dává vlastnost Bounds, obdélník relativně k ploše vlastnost DesktopBounds. Vlastnost ClientRectangle je obdélník relativně vzhledem k samotnému formuláři a popisuje klientkou oblast formuláře. Nejvíce se z těchto tří vlastností užívá patrně ClientRectangle, když ne z jiných důvodů, tak proto, že popisuje, která oblast se použije, když se bude kreslit: void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.graphics; g.fillellipse(brushes.yellow, this.clientrectangle); g.drawellipse(pens.darkblue, this.clientrectangle); Někdy je třeba převést nějaký bod, který je v souřadnicích relativně k obrazovce, na bod, který má souřadnice relativně ke klientské oblasti, nebo provést opačnou konverzi. Například, událost HelpRequested, která se generuje, když uživatel klikne na tlačítko Help, a pak na nějaký ovládací prvek, se odesílá zpracovateli v souřadnicích obrazovky. Abyste však zjistili, na kterém ovládacím prvku uživatel klikl, musíte mít pozici myši v klientských souřadnicích. Mezi oběma systémy souřadnic se převádí pomocí PointToScreen a PointToClient: void Form1_HelpRequested(object sender, HelpEventArgs e) { // Převede souřadnice vzhledem k obrazovce // na souřadnice vzhledem ke klientovi Point pt = this.pointtoclient(e.mousepos); // Vyhledá ovládací prvek, na kterém uživatel klikl foreach (Control control in this.controls) { if (control.bounds.contains(pt) ) { Control ovladaciprvekkterypotrebujenapovedu = control; break; Chcete-li konvertovat souřadnice celého obdélníka mezi oběma systémy souřadnic, můžete také použít RectangleToScreen a RectangleToClient.

Omezování velikosti formuláře Formuláře 77 Když si pečlivě připravíte rozvržení ovládacích prvků, často je třeba pro ně zajistit určitý minimální prostor; nebo to diktují požadavky při jejich realizaci. Méně často je třeba, aby formuláře nepřekračovaly určitou maximální velikost (s tím může hodně vypomoci kotvení a přichycování, která popíšu později). Každopádně je vždy možné nastavit minimální či maximální velikost formuláře pomocí vlastností MinimumSize, resp. MaximumSize. Následující ukázka nastaví pevnou výšku 200, minimální šířku 300, přičemž horní limit pro šířku není stanoven: void Form1_Load(object sender, System.EventArgs e) { // minimální šířka bude 300, minimální výška 200 this.minimumsize = new Size(300, 200); // limit na maximální šířku není, maximální výška bude 200 this.maximumsize = new Size(int.MaxValue, 200); Všimněte si, že se v kódu používá maximální hodnota celočíselného typu, čímž se vlastně říká, že žádný horní limit není. Velikost a umístění formuláře řídí ještě jedna vlastnost, která se jmenuje WindowState, a může nabývat jedné z hodnot výčtu FormWindowState: enum FormWindowState { Maximized, Minimized, Normal, //výchozí hodnota Form.WindowState Standardně je WindowState nastavena na Normal, což znamená, že okno není maximalizované na celou plochu, ani není minimalizované, kdy formulář není vidět, a je jen v podobě tlačítka na hlavním panelu. Ve svém programu můžete tuto vlastnost získávat i nastavovat podle chuti, chcete-li ovlivňovat stav svého formuláře. Jestliže však ukládáte velikost a pozici svého formuláře mezi sezeními aplikace, možná se rozhodnete, že obnovíte WindowState na Normal, aby byla uloženou velikostí reprezentovaná velikost v normálním stavu, a ne minimalizovanou či maximalizovanou velikostí: void Form1_Closing(object sender, CancelEventArgs e) { // Zachytí vlastnosti dřív, než formulář zmizí FormWindowState stav = this.windowstate; this.windowstate = FormWindowState.Normal; Point pozice = this.location; Size velikost = this.clientsize; // uloží stav, pozice a velikost mezi sezeními

78 Formuláře // obnoví vlastnosti v události Load Popis toho, jak a kde je vhodné udržovat nastavení aplikace mezi sezeními, viz kapitola 11: Aplikace a sezení. Pořadí podle osy z Další vlastností související s pozicí, kterou by mohli ovlivňovat uživatelé, nebo kterou byste mohli udržovat mezi sezeními, je vlastnost TopLevel. Doposud jsme se zabývali pozicí jen v jedné rovině, podle os x a y. Když se však uživatel přepíná mezi okny, žongluje také systém Windows s pořadím podle osy z ( z-order). To diktuje, které okno bude před kterým. Dále, pořadí podle osy z je rozděleno do dvou vrstev. Normální okna jsou zobrazena od nejmenšího pořadí podle osy z vpředu k největšímu vzadu. Nad všemi normálními okny jsou okna nejvyšší úrovně ( topmost windows), která se také kreslí relativně vzhledem k ostatním oknům nejvyšší úrovně, vpředu nejmenší pořadí podle osy z, vzadu největší, ale vždy se kreslí nad všemi normálními okny. Chcete-li se podívat na okno nejvyšší úrovně, stiskněte Ctrl+Shift+Esc. V mnoha verzích Windows se vám objeví před všemi ostatními okny okno Správce úloh ( Task Manager). Standardně je to okno nejvyšší úrovně a kreslí se vždy před všemi normálními okny, ať už je to aktivní okno nebo ne. Toto chování můžete změnit (já to dělám vždycky), když zrušíte zaškrtnutí políčka Vždy navrchu na stránce Obecné okna vlastností hlavního panelu (Options Always On Top). Kdyby byl Správce úloh implementovaný pomocí WinForms, implementoval by zmíněný rys přepínáním vlastnosti TopMost svého hlavního formuláře. Ozdoby formuláře Kromě velikosti a pozice mají formuláře řadu dalších vlastností, které spravují různé další aspekty jejich vzhledu a odpovídajícího chování. Následující nastavení ovlivňují neklientské ozdoby ( non-client adornments) formuláře: tedy ty části, které leží vně klientské oblasti, a které kreslí Windows. FormBorderStyle určuje, zda bude mít formulář ohraničení, zda se bude moci měnit jeho velikost, a zda má mít titulkový pruh v normální nebo ve zmenšené velikosti. Dobře navržené formuláře a dialogy ponechávají výchozí hodnotu Sizable. Dialogy, které jdou na nervy, mají změněnou hodnotu této vlastnosti na některou z voleb, kdy se velikost formuláře nedá měnit. Programátoři obvykle volí možnosti, u nichž se nedá měnit velikost proto, že se obávají různých potíží s rozvržením, WinForms to však zvládají hladce, což proberu v kapitole později. Kromě toho existují ještě dva styly pro okna nástrojů jeden s pevnou, jeden s měnitelnou velikostí používají se při budování volně plovoucích oken ve stylu panelů nástrojů ( toolbars).

Formuláře 79 ControlBox je Booleovská hodnota určující, zda bude, nebo nebude mít formulář v levém horním rohu ikonu, a zda bude mít zároveň v pravém horním rohu tlačítko pro zavření formuláře. Je-li vlastnost nastavená na false, pak se nezobrazí ovládací nabídka ani kliknutím v levém horním rohu formuláře, ani kliknutím pravým tlačítkem na titulkovém pruhu. Obdobně, když má ControlBox hodnotu false, ignorují se vlastnosti MaximizeBox a MinimizeBox, a jejich tlačítka se nezobrazí. Výchozí hodnota vlastnosti je true, ale často se nastavuje na false u modálních dialogů. Vlastnosti MaximizeBox a MinimizeBox určují, zda se v titulkovém pruhu formuláře zobrazí tlačítka pro maximalizaci, resp. minimalizaci formuláře. Výchozí hodnota obou vlastností je true, ale často se nastavují na false u modálních dialogů. Vlastnost HelpButton zobrazí vlevo od tlačítka pro zavření formuláře tlačítko s otazníkem, ale jen tehdy, je-li ControlBox nastavena na true, a obě vlastnosti MaximizeBox a MinimizeBox jsou nastavené na false.výchozí hodnota této vlastnosti je false, ale často se zapíná na true u modálních dialogů. Když uživatel klikne na tlačítko s otazníkem, a pak někde jinde na formuláři, odpálí se událost HelpRequested formuláře, aby se uživateli mohla poskytnout nějaká nápověda. Ale bez ohledu na to, zda je vlastnost HelpButton nastavena na true nebo na false, událost HelpRequested se odpaluje vždy, když uživatel stiskne F1. Vlastnost Icon určuje obrázek použitý pro ikonu formuláře. Vlastnost SizeGripStyle povoluje hodnoty z výčtu SizeGripStyle: Auto, Hide nebo Show. Úchyt pro změnu velikosti (size grip) je prvek v pravém dolním rohu formuláře, který indikuje, že se velikost formuláře dá měnit. Výchozí hodnota je Auto, která vyjadřuje, že je úchyt v pravém dolním rohu podle potřeby, v závislosti na hodnotě vlastnosti FormBorderStyle formuláře. Nastavení Auto rozhodne, že je úchyt zapotřebí tehdy, má-li formulář měnitelnou velikost, a je-li zobrazený modálně. Dále, má-li formulář stavový řádek, pak se vlastnost SizeGripStyle formuláře ignoruje, protože se dává přednost Booleovské vlastnosti SizingGrip samotného ovládacího prvku pro stavový řádek ( StatusBar). ShowInTaskbar je Booleovská vlastnost, která určuje, zda se hodnota vlastnosti Text formuláře objeví jako tlačítko na hlavním panelu Windows. Výchozí hodnota vlastnosti je true, ale často se u modálních formulářů nastavuje na false. Přestože je většina z výše uvedených vlastností na sobě nezávislých, nefungují souběžně všechny jejich možné kombinace. Například, je-li FormBorderStyle nastavena na jeden ze dvou stylů pro okna nástrojů, nezobrazují se tlačítka pro maximalizaci a minimalizaci, bez ohledu na to, jakou mají hodnotu odpovídající vlastnosti MaximizeBox a MinimizeBox. Co funguje, a co ne, zjistíte nejlépe experimentováním.

80 Formuláře Průhlednost formuláře Kromě vlastností, které specifikují, jak má systém Windows realizovat neklientskou část formuláře, poskytuje třída Form sadu vlastností, jimiž lze měnit vzhled formuláře jako celku, včetně toho, že může být průsvitný, nebo úplně průhledný, neviditelný. Vlastnost, která řídí průhlednost celého formuláře, se jmenuje Opacity, a její výchozí hodnota je 1.0, neboli stoprocentně neprůhledný. Hodnota mezi 0.0 a 1.0 označuje stupeň průhlednosti na základě podpory tzv. alpha-blending 7 v modernějších verzích Windows, přičemž jakákoli hodnota menší než 1.0 znamená, že je formulář částečně průhledný (průsvitný). Průsvitnost je převážně salónní trik, je to ale docela zábavné a může potěšit, když uděláte okna nejvyšší úrovně méně nápadná a méně otravná, než jak by vypadala normálně. Viz ukázka: void InitializeComponent() { this.opacity = 0.5; this.text = "Opacity = 0.5"; this.topmost = true; void OpacityForm_Activated(object sender, EventArgs e) { timer1.enabled = true; void timer1_tick(object sender, EventArgs e) { if( this.opacity < 1.0 ) this.opacity += 0.1; this.text = "Opacity = " + this.opacity.tostring(); void Form1_Deactivate(object sender, EventArgs e) { timer1.enabled = false; this.opacity = 0.5; this.text = "Opacity = " + this.opacity.tostring(); Ukázka obsahuje kód formuláře nejvyšší úrovně, jehož vlastnost Opacity startuje na 50 %. Když se formulář aktivuje, začne tikat časovač, který při každém svém tiknutí zvýší hodnotu Opacity o 10 %, čímž se vyrobí hezký efekt roztmívání, který vidíte na obrázku 2.4. Když se formulář deaktivuje, nastaví se opět na poloprůhledný (50 %), takže bude dostatečně vidět na to, aby se dalo přečíst, co je na něm, a dalo se na něm klikat, ale nebude působit tak rušivě, jako kdyby byl neprůhledný.