Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 13

Uvod u Windows Forms i kreiranje prve aplikacije

00:14:00

Jedinica: 2 od 40

Inicijalna tehnologija za razvoj grafičkog korisničkog okruženja .NET okvira bila je tehnologija Windows
Forms. Ova tehnologija se može doživeti samo kao omotač znatno nižih tehnologija napisanih izvornim
jezikom, o čemu više možete pročitati u uvodnoj lekciji ovog kursa.

Svakako, ukoliko danas počinjete da razvijate novu Windows aplikaciju, mnogo će primerenije biti
korišćenje tehnologije WPF, ukoliko vam podrška za operativne sisteme ispod Windows XP nije
potrebna.

Ipak, da bi se što bolje razumeo WPF i prednosti koje je on doneo, modul pred vama će biti posvećen
kratkom upoznavanju sa tehnologijom WinForms.

Šta je Windows Forms?


Windows Forms ili skraćeno WinForms je biblioteka klasa namenjenih razvoju UI-ja desktop aplikacija
za Windows i predstavlja sastavni deo .NET frameworka. WinForms praktično predstavlja omotač za
funkcionalnosti definisane izvornim jezikom u komponentama User/User32 i GDI/GDI+. Stoga
WinForms deli sve prednosti i nedostatke ovih komponenata, čineći ih dostupnim .NET okruženju.

WinForms aplikacija
Za početak biće prikazan kompletan kôd prve Windows aplikacije koja će biti kreirana u ovoj lekciji.

 code
 source

1. namespace MyNamespace
2.
3. {
4.
5. public class MyForm : System.Windows.Forms.Form
6.
7. {
8.
9.
10.
11. public MyForm()
12.
13. {
14.
15. this.Text = "Hello Form";
16.
17. }
18.
19. [System.STAThread]
20.
21. public static void Main()
22.
23. {
24.
25. System.Windows.Forms.Application.EnableVisualStyles();
26.
27. System.Windows.Forms.Application.Run(new MyForm());
28.
29. }
30.
31.
32.
33. }
34.
35. }
36.

Prikazani kod može biti napisan u bilo kojem tekst-editoru. Fajl je potrebno sačuvati sa ekstenzijom
.cs.

Za kompajliranje izvornog koda napisanog C# jezikom, koristi se C Sharp kompajler. C# kompajler je


u suštini fajl sa nazivom csc koji se može pronaći u okviru Windows foldera. Zavisno od verzije
instaliranog .NET frameworka, putanja do foldera koji sadrži ovaj kompajler može izgledati ovako:

 code
 source

1. C:\Windows\Microsoft.NET\Framework\v4.0.30319
2.

Napomena: Preporučljivo je da se ovaj folder odmah smesti u sistemsku Path varijablu, tako da C# kompajler bude dostupan
direktno bez navođenja kompletne putanje.

Za kompajliranje fajla sa izvornim C# kodom dovoljno je unutar Command Prompta, napisati sledeće:

 code
 source

1. csc MyForm.cs
2.

Nakon izvršavanja prikazane komande, odnosno, nakon kompajliranja izvornog koda, u folderu u kome
se nalazi fajl sa izvornim kodom postojaće još jedan fajl sa ekstenzijom .exe. Pokretanjem ovog fajla
napisani C# kôd će se izvršiti i na displeju će biti prikazana jedna forma, kao rezultat napisanog koda.

2.1 – Prozor aplikacije Windows Forms

Iako kreirana aplikacija i nema neku upotrebnu vrednost, njen cilj je da prikaže kako se sa samo
nekoliko linija koda može kreirati potpuno funkcionalna Windows aplikacija. Praktično, većinu posla,
vezanog za prikaz prozora, obavio je za nas u pozadini .NET framework i Windows. Kada se ovako
nešto kaže, pre svega se misli na iscrtavanje ivica prozora i naslovne trake sa svim potrebnim
sistemskim tasterima (minimize, maximize, close), ali i na obradu osnovnih radnji koje korisnik može
da preduzme i na odgovarajuće ponovno iscrtavanje prozora u takvim situacijama.

U nastavku će biti objašnjena svaka linija prikazanog koda.

Prvom linijom prikazanog koda definiše se prostor imena unutar koga će se definisati glavna klasa
aplikacije. Prostor imena definiše grupu klasa, struktura i tipova srodnih karakteristika koji čine jednu
logičku celinu. Stoga, definicija prostora imena u prikazanom programu jeste sledeća:

 code
 source

1. namespace MyNamespace
2.
3. {
4.
5.
6.
7. }
8.

S obzirom na to da su prostori imena zapravo kontejneri za druge tipove, u prikazanom primeru


prostor imena MyNamespace, sadrži klasu MyForm. Klasa MyFrom nasleđuje klasu Form, koja se nalazi
u prostoru imena System.Windows.Forms.

 code
 source

1. namespace MyNamespace
2.
3. {
4.
5. public class MyForm : System.Windows.Forms.Form
6.
7. {
8.
9. . . .
10.
11. }
12.
13. }
14.

Inače, ovo je ključna tačka, koja kreiranu aplikaciju pretvara u Windows aplikaciju sa grafičkim
korisničkim okruženjem. Form klasa može da predstavlja bilo koji prozor aplikacije, od dijaloga pa sve
do MDI klijentskih prozora, i pritom obezbeđuje prostor za smeštanje kontrola.

Kreirana klasa MyForm poseduje dva člana. Jedan je konstruktor koji se koristi za instanciranja objekata
ove klase. Drugi je statička metoda Main.

 code
 source

1. public class MyForm : System.Windows.Forms.Form


2.
3. {
4.
5. public MyForm()
6.
7. {
8.
9. this.Text = "Hello Form";
10.
11. }
12.
13. public static void Main()
14.
15. {
16.
17. . . .
18.
19. }
20.
21. }
22.

Definisani konstruktor je bez parametara i takav konstruktor se naziva podrazumevani. Unutar


konstruktora nalazi se jedna linija koda, kojom se postavlja tekst naslovne trake. To se postiže
postavljanjem vrednosti svojstva Text trenutne instance klase MyForm.

Drugi član ove klase je statička metoda Main, što je zapravo ulazna tačka C# programa. Nakon što
operativni sistem Windows kreira novi proces, inicijalizuje interne strukture podataka i učita program
u memoriju, biva pozvana upravo statička metoda Main. Moguće je da ova metoda bude void ili da
vrati podatak tipa int, ali je moguće i da prihvati komandne parametre kao niz stringova. Tako praktično
postoji četiri različita potpisa ove metode:

 code
 source

1. public static void Main();


2.
3. public static int Main();
4.
5. public static void Main(string[] args);
6.
7. public static int Main(string[] args);
8.

U primeru sa početka ove lekcija, ova metoda Main ima sledeći izgled:

 code
 source

1. [System.STAThread]
2.
3. public static void Main()
4.
5. {
6.
7. System.Windows.Forms.Application.EnableVisualStyles();
8.
9. System.Windows.Forms.Application.Run(new MyForm());
10.
11. }
12.

Metoda nema povratnih vrednosti i ne prihvata parametre. Posebnu pažnju je potrebno obratiti na
oznaku [System.STAThread]. Windows Forms aplikacije zahtevaju ovu liniju koja ukazuje na to da je
potrebno da nit koja izvršava ovu metodu koristi takozvani single-threaded apartment (STA) threading
model.

Unutar Main metode pozivaju se dve metode Application klase. Application klasa se koristi za
upravljanje aplikacijama, nitima i sistemskim porukama. Ova klasa se najčešće koristi za prikaz inicijalne
forme aplikacije i za čekanje na povratnu korisničku interakciju.

U prvoj liniji poziva se metoda EnableVisualStyles, koja ima za efekat iscrtavanje kontrole u trenutno
aktivnom stilu operativnog sistema.

U drugoj liniji unutar main metode poziva se metoda Run. Pozivanjem ove metode započinje petlja
unutar trenutne niti gde se čeka na sistemske poruke Windowsa. Ukoliko se ovoj metodi prosledi
instanca Form klase, kao što je to u primeru ove lekcije i učinjeno, takav prozor će biti prikazan
korisniku.

Ulaznu tačku WinForms aplikacije predstavlja:


Main metoda

InitializeComponent metoda

dispose metoda

nema ulazne tačke

Kreiranje prve aplikacije pomoću okruženja Visual Studio


Sve što je do sada urađeno bez ikakvih pomagala moguće je postići i upotrebom razvojnog okruženja
Visual Studio.

Za kreiranje prve Windows Forms aplikacije potrebno je kreirati novi projekat. To se postiže odabirom
opcije File->New->Project... ili prečicom na tastaturi CTRL+SHIFT+N.
2.2 – Kreiranje novog projekta u Visual Studio okruženju

U okviru prozora New Project potrebno je odabrati neki od .NET jezika kojima će se kreirati aplikacija,
kao i tip šablona koji želimo da Visual Studio napravi za nas. S obzirom na to da je potrebno kreirati
Windows Forms aplikaciju, adekvatan je Windows Forms Application šablon.

2.3 – Windows Forms Application šablon

Još jedna stvar ne koju je potrebno obratiti pažnju jeste imenovanje projekta i odabir putanje na kojoj
će fajlovi biti smešteni.

2.4 – Postavljanje imena aplikacije i njene lokacije na disku

Za naziv projekta u ovoj lekciji postavljeno je FirstWinApp, dok je kao putanja na kojoj će se nalaziti
fajlovi postavljeno C:\WinDev. Poslednje polje je za nas automatski popunio Visual Studio i ono se
odnosi na naziv solutiona.
Visual Studio koristi projekte i solutione kako bi organizovao kôd aplikacije koja se razvija.
Konceptualno, projekat je kolekcija fajlova koji proizvode .NET assembly, odnosno dll biblioteku ili
izvršni exe fajl. Solution predstavlja skup više projekata, tako da se različiti moduli aplikacije mogu
razvijati u različitim projektima. Praktično, pravljenje solutiona sa samo jednim projektom i nema
preteviše smisla, ali će najčešći slučaj pri razvoju ozbiljnih aplikacija biti upravo postojanje više
projekata unutar jednog solutiona. Visual Studio kreira folder za svaki novi solution, unutar koga opet
kreira folder za svaki pojedinačni projekat.

Nakon kreiranja solutiona i projekta unutar odabranog foldera postojaće folder sa nazivom solutiona
koji će sadržati fajl sa ekstenzijom .sln. Reč je o o tipu fajla koji predstavlja solution. Pored ovog fajla,
solution sadrži i projektni folder. Tip fajla koji predstavlja C# projekat Visual Studio-a ima ekstenziju
.csproj.

Ali šta je sve Visual Studio uradio za nas?

U okviru Solution Explorera može se videti struktura projekta FirstWinApp unutar istoimenog solutiona.

2.5 – Struktura kreiranog Solutiona

Odeljak Properties sadrži podešavanja koja se tiču Assemblyja (AssemblyInfo.cs), zatim informacije o
resursima (Resources.resx) i na kraju informacije o podešavanjima (Settings.settings).

Odeljak References sadrži listu referenci projekta koje su neophodne kodu projekta za izvršavanje.

App.config je XML konfiguracioni fajl u koji je moguće smeštati razna podešavanja aplikacije.

Form1.cs je klasa koja predstavlja primarnu formu aplikacije, koju je okruženje automatski generisalo
za nas.

Program.cs je takođe klasa koja je automatski generisana od okruženja i ona predstavlja klasu koja
sadrži metodu Main, kao ulaznu tačku aplikacije.

Nakon svega ovoga možete da zaključite da je u oba prikazana primera postignuto identično
ponašanje, uz pomoć razvojnog okruženja ili bez te pomoći.
Praktično, kompletan kôd aplikacije nalazi se smešten unutar tri fajla. U nastavku će ovi fajlovi biti
detaljno objašnjeni.

Program.cs

Program.cs je fajl u kome je definisana Main metoda, na veoma sličan način na koji je to postignuto
na početku ove lekcije, bez pomoći razvojnog okruženja. Evo kako izgleda sadržaj ovog fajla:

 code
 source

1. using System;
2.
3. using System.Collections.Generic;
4.
5. using System.Linq;
6.
7. using System.Threading.Tasks;
8.
9. using System.Windows.Forms;
10.
11.
12.
13. namespace WinForm
14.
15. {
16.
17. static class Program
18.
19. {
20.
21. /// <summary>
22.
23. /// The main entry point for the application.
24.
25. /// </summary>
26.
27. [STAThread]
28.
29. static void Main()
30.
31. {
32.
33. Application.EnableVisualStyles();
34.
35. Application.SetCompatibleTextRenderingDefault(false);
36.
37. Application.Run(new Form1());
38.
39. }
40.
41. }
42.
43. }
44.

Praktično, kod je identičan onom sa početka lekcije. Najbitniji podatak jeste da se unutar metode Run
instancira klasa Form1 koja predstavlja formu.

Forma je parcijalno definisana unutar Form1 klase. Evo kako ovaj fajl izgleda:

 code
 source

1. using System;
2.
3. using System.Collections.Generic;
4.
5. using System.ComponentModel;
6.
7. using System.Data;
8.
9. using System.Drawing;
10.
11. using System.Linq;
12.
13. using System.Text;
14.
15. using System.Threading.Tasks;
16.
17. using System.Windows.Forms;
18.
19.
20.
21. namespace WinForm
22.
23. {
24.
25. public partial class Form1 : Form
26.
27. {
28.
29. public Form1()
30.
31. {
32.
33. InitializeComponent();
34.
35. }
36.
37. }
38.
39. }
40.
Prilikom definicije ova klase, može se primetiti upotreba ključne reči partial. Ova ključna reč ukazuje na
to da fajl sadrži samo deo definicije određene klase. Praktično, ova ključna reč omogućava da se jedna
klasa definiše u više fajlova, pri čemu bi kompletna definicija klase bio skup svih parcijalnih definicija.

Takođe, unutar ovog fajla, u okviru konstruktora, postoji linija u kojoj se poziva
metoda InitializeComponent. Ovo je specijalna metoda koju je generisao Visual Studio Designer.

Prilično je jasno da klasi Form1 nedostaje deo koda, a ukoliko se u obzir uzme izlaganje vezano za
ključnu reč partial, može se zaključiti da se kôd koji nedostaje nalazi u okviru nekog drugog fajla. Taj
drugi fajl je Form1.Designer.cs i on je automatski generisan od okruženja. Evo kako izgleda taj fajl:

 code
 source

1. namespace WinForm
2.
3. {
4.
5. partial class Form1
6.
7. {
8.
9. /// <summary>
10.
11. /// Required designer variable.
12.
13. /// </summary>
14.
15. private System.ComponentModel.IContainer components = null;
16.
17.
18.
19. /// <summary>
20.
21. /// Clean up any resources being used.
22.
23. /// </summary>
24.
25. /// <param name="disposing">true if managed resources should be disposed;
otherwise, false.</param>
26.
27. protected override void Dispose(bool disposing)
28.
29. {
30.
31. if (disposing && (components != null))
32.
33. {
34.
35. components.Dispose();
36.
37. }
38.
39. base.Dispose(disposing);
40.
41. }
42.
43.
44.
45. #region Windows Form Designer generated code
46.
47.
48.
49. /// <summary>
50.
51. /// Required method for Designer support - do not modify
52.
53. /// the contents of this method with the code editor.
54.
55. /// </summary>
56.
57. private void InitializeComponent()
58.
59. {
60.
61. this.components = new System.ComponentModel.Container();
62.
63. this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
64.
65. this.Text = "Form1";
66.
67. }
68.
69.
70.
71. #endregion
72.
73. }
74.
75. }
76.

Prvo što se i ovde može primetiti jeste upotreba ključne reči partial. Njeno značenje je, uzimajući u
obzir prethodni opis, prilično jasno.

Varijabla components je neophodna i njeno postojanje zahteva designer, kako bi osigurao


odgovarajuće raspoređivanje komponenata pri pokretanju aplikacije.

Ovaj fajl još sadrži i definiciju dispose metode, koja omogućava samostalno upravljanje resursima.
Naime, zbog postojanja sistema Garbage Collection u .NET-u, programer nema kontrolu nad
oslobađanjem memorije koju zauzimaju objekti koji se više ne koriste. Ova metoda dispose omogućava
upravo oslobađanje resursa, zauzetih od komponente.

Na kraju, u ovom fajlu, nalazi se i metoda Initialize Component, koju koristi designer, za kreiranje i
inicijalizaciju kontrola i ostalih komponenata forme. Kod ove metode Windows Forms Designer
procesuira svaki put kada je potrebno prikazati formu.

You might also like