====== Základní ovládací prvky ====== Opět vytvoříme nový projekt Menu File / New / Project \\ Vybereme typ projektu ** Windows Forms App (.NET Framework) C# ** Jako minule přidáme jedno tlačítko (na levé záložce Toolbox, v něm Button) \\ Klikneme na tlačítko, na pravé straně záložka Properties - zde můžeme nastavovat parametry tlačítka. {{pw::intro_prop.png??480}} Přidáme funkce reagující při "příchodu" a "odchodu" myši. \\ Opět klikneme na tlačítko, na pravé straně záložka Properties, zde přepneme "tlačítkem s bleskem" na události (events). \\ Ve skupině "Mouse" nalezneme řádky **MouseEnter** a **MouseLeave**. \\ Ve druhém sloupci dvakrát klikneme do prázdné kolonky a objeví **button1_MouseEnter** a **button1_MouseLeave**. \\ {{pw::intro_event.png}} A vždy nás v textovém editoru předepíší prázdné metody button1_MouseEnter a button1_MouseLeave. \\ Tyto metody nepište sami, vždy je "naklikejte", neboť na pozadí ještě vzniká vazba mezi tlačítkem a funkcí. Pro přepínáni mezi vizuálním návrhem a zdrojovým textem můžete použít záložky **Form1.cs** a **Form1.cs [Design]**. \\ Nebo klávesy **F7** a **Shift F7**. private void button1_MouseEnter(object sender, EventArgs e) { button1.Text = "Je zde mys"; button1.ForeColor = Color.Red; } private void button1_MouseLeave(object sender, EventArgs e) { button1.Text = "Uz odesla"; button1.ForeColor = Color.Blue; } Můžete si zkusit přidat reakci na MouseMove. private void button1_MouseMove(object sender, MouseEventArgs e) { button1.Left += 10; } ===== Zdrojový text okna ===== **using** import modulů (obdoba #include z C, ale moduly jsou již zkomilované) **namespace** celý náš program bude v prostoru jmen, který jsme si vybrali při vytváření projektu **class Form1** třída pro naše okno, odvozená ze standardní třídy **Form**, později si vybereme nějaký lepsší identifikátor **public** třída je dostupná i z jiných jmenných prostorů **partial** někde jinde se nalézá další zdrojový text, který bude s tímto zdrojovým textem "smíchán" using System; using System.Drawing; using System.Windows.Forms; namespace Introduction { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_MouseEnter(object sender, EventArgs e) { button1.Text = "Je zde mys"; button1.ForeColor = Color.Red; } private void button1_MouseLeave(object sender, EventArgs e) { button1.Text = "Uz odesla"; button1.ForeColor = Color.Blue; } private void button1_MouseMove(object sender, MouseEventArgs e) { button1.Left += 10; } } } Implementaci jednotlivé metody píšeme přímo do deklarace třídy. \\ "Hlavičkové soubory" se nepoužívají. \\ Překladač si nejprve přečte celou třídu a vynechává těla jednotlivých metod. \\ Při dalším průchodu zpracovává těla metod. \\ Uvnitř metody můžeme používat identifikátory deklarované až dále v naší třídě. ===== Část programu navrhovaná pomocí myši ===== Podržte **Ctrl** a klikněte na **InitializeComponent** ve zdrojovém textu našeho okna. \\ Zobrazí se soubor **Form1.Designer.cs** obsahující zdrojový kód vygenerovaný podle našeho návrhu. Je tam komentář upozorňující, že tuto část nemáte editovat. \\ Ale můžete si do schránky zkopírovat kousek zdrojového textu a přenést do své části programu. namespace Introduction { partial class Form1 { private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(22, 12); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(228, 71); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); this.button1.MouseEnter += new System.EventHandler(this.button1_MouseEnter); this.button1.MouseLeave += new System.EventHandler(this.button1_MouseLeave); this.button1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.button1_MouseMove); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(334, 164); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); } private System.Windows.Forms.Button button1; } } Například zde vidíme, jak se vytvořila již zmíněná "vazba" na metodu button1_MouseEnter this.button1.MouseEnter += new System.EventHandler(this.button1_MouseEnter); uvnitř naší třídy Form1 by stačilo button1.MouseEnter += button1_MouseEnter; Také zde zahlédnete deklaraci proměnné **button1** private System.Windows.Forms.Button button1; Typ **Button** je zde uveden i s odpovídajícím prostorem jmen, co kdyby si někdo předefinoval identifikátor Button. === Již vymazaná metoda === Pokud někdy vytvoříte metodu a později zdrojový text metody smažete (u mne **button1_Click**). Překladač ohlásí chybu 'Form1' does not contain a definition for 'button1_Click' ... Tak odstrańte nebo zakomentujte příslušnou řádku // this.button1.Click += new System.EventHandler(this.button1_Click); ===== Hlavní program ===== Na záložce "**Solution Exlorer**" je dvakrát klikněte na **Program.cs** (obdoba funkce **main** v C) namespace Introduction { static class Program { static void Main() { Application.Run (new Form1()); } } } C# na "globální úrovni" dovoluje jen třídy a prostory jmen, nukoliv globální funkce. \\ Program začne statickou metodou **Main** ve třídě **Program**. \\ Statická metoda je obdobou globální funkce schované dovnitř třídy. \\ Metoda Main vytvoří novou instanci naší třídy **Form1** a naše okno zobrazí. ===== Vlastnosti, properties ===== V souboru Form1.cs podžte **Ctrl** a klikněte na **Text** na následující řádce button1.Text = "Je zde mys"; Objeví se deklarace identifikátoru Text string Text { get; set; } Na deklaraci funkce to nevypadá, chybí kulaté závorky. \\ Deklarace proměnné to také není, přebývají složené závorky. Vlastnosti (properties) používáme podobně jako proměnné. \\ Pokud do nich přiřazujeme hodnotu, volá se nějaká "set" funkce. \\ Při čtení hodnoty se volá "get" funkce. ===== Několik ovládacích prvků ===== Do Form1 přidáme * **Checkbox**, dostane identifikátor checkbox1 * **NumericUpDown** numericUpDown1 * **TextBox** textBox1 * ještě jeden **TextBox** * pomocí vlastnosti **(name)** ve skupině Design nastavíme identifikátor na **outputBox** * nastavíme vlastnost **Multiline** ve skupině Behavior na **true** dvakrát klikneme na tlačítko button a doplníme program public void send (string text) { outputBox.AppendText (text + "\r\n"); } private void button1_Click(object sender, EventArgs e) { bool check = checkBox1.Checked; int num = (int) numericUpDown1.Value; string txt = textBox1.Text; send ("checkbox: " + check); send ("number: " + num); send ("text: " + txt); send (""); } {{pw::intro_form.png}}