You are on page 1of 18

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