Csharp - programowanie pod Windows - podstawy

taipan
/* 
 * C# (CSHARP) TUTORIAL NR 01
 * -------------------------------------------------------------------------------
 * Zakres omówionych pojęć:
 * 1) Podstawowe pojęcia dotyczące C#.
 * 2) Dodawanie komponentów i nadawanie im podstawowych właściwości. 
 * 3) Podstawowe funkcje graficzne.
 * 4) Odczytywanie współrzędnych myszki.
 * 
 *              wersja 1.0.2
 *                                            made by taipan
 * -------------------------------------------------------------------------------
 * W następnych tutorialach powinienem omówić jak łączy się poszczególne obiekty
 * ze sobą. Ale nie wiem, czy jeszcze powstanie następny tutorial ;) 
 */

// Przestrzenie, z których będziemy korzystać
// Potrzebne są one aby móc korzystać z różnych funkcji.
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

// Deklaracja nowej klasy, której od razu przepisujemy formatkę.
// Inaczej trzeba by było ją tworzyć w programie.
public class Wprowadzenie : Form
{
	// TUTAJ DEKLARUJEMY WSZYSTKIE NOWE OBIEKTY, KTÓRE WYSTĘPUJĄ W WIĘCEJ NIŻ
	// JEDNEJ METODZIE.
	// WYJĄTEK STANOWI GŁÓWNA FORMATKA (this), KTÓREJ NIE TRZEBA W OGÓLE DEKLAROWAĆ,
	// PONIEWAŻ ISTNIEJE SAMA PRZEZ SIĘ :)
	Form nazwa_formatki = new Form();
	Label wspolrzedne_myszki = new Label();

	int x = 1;  // deklaracja zmiennej potrzebnej do metody "zdarzenie buttona", która będzie potrzebna do iteracji
				// x nie może znajdować się w metodzie, ponieważ x zawsze przyjmowałoby wartości
				// jakie jej na dano na samym początku i nie mogłoby rosnąć

	// Nazwa metody taka sama jak nazwa klasy sprawia, że jest ona główną metodą.
	public Wprowadzenie()
	{

		/* this - poprzez rekurencję odwołuje się do samej siebie
			Zamknięcie formatki głównej powoduje zamknięcie wszystkich
			formatek innych */
		this.Text = "Formatka Nr 1";
		// Nadanie rozmiaru formatce (x,y).
		// x - szerokosc
		// y - wysokosc
		this.Size = new Size(500,400);
		// Color zdefiniowany za pomocą palety RGB.
		this.BackColor = Color.FromArgb(20,80,210);
		// Bez tego, główna formatka pojawiałaby się na końcu,
		// przez co zasłaniałaby inne formatki.
		this.Show();

		// Poniewaz zadeklarowalismy juz formatkę w klasie, więc tutaj nie trzeba
		// znowu jej tworzyć, ponieważ jest już utworzona.
		nazwa_formatki.Text = "Formatka Nr 2";
		nazwa_formatki.Size = new Size(600,500);
		nazwa_formatki.Show();

		// tworzenie buttonow
		Button nazwa_buttonu = new Button();
		nazwa_buttonu.Text = "Tekst na buttonie";
		nazwa_buttonu.Size = new Size(200,30);
		// Location = new Point(wartosc x, wartosc y)
		// wartosc x - pikseli, liczac od lewej komponentu, na ktory sie chce sie to dodac
		// wartosc y - pikseli, liczac od gory komponentu, na ktory sie chce sie to dodac
		nazwa_buttonu.Location = new Point(100,100);
		// Click - deklaracja zdarzenia po kliknieciu na komponent
		// Zdarzenia są tworzone jako metody.
		nazwa_buttonu.Click += new EventHandler(zdarzenie_buttona);
		// Dodanie komonentu do programu, wzór 1. 
		nazwa_formatki.Controls.Add(nazwa_buttonu);
        
		// tworzenie pol tekstowych
		Label nazwa_tekstu = new Label();
		// zmiana czcionki na labelu
		nazwa_tekstu.Font = new Font("Times New Roman", 12, FontStyle.Bold);
		// zmiana koloru czcionki
		nazwa_tekstu.ForeColor = Color.Blue;
		// nadanie tekstowi tła (background)
		nazwa_tekstu.BackColor = Color.White;
		nazwa_tekstu.Location = new Point(200, 10);
		nazwa_tekstu.Size = new Size(200, 20);
		nazwa_tekstu.Text = "Tekst na labelu";
		// Dodanie komonentu do programu, wzór 2. 
		nazwa_formatki.Controls.AddRange(new Control[] { nazwa_tekstu });

		// tworzenie pol formularzy (textBox)
		TextBox nazwa_texboxa = new TextBox();
		nazwa_texboxa.Text = "Tekst w textboxie";
		nazwa_texboxa.Location = new Point(0, 150);
		nazwa_formatki.Controls.AddRange(new Control[] { nazwa_texboxa });

		// tworzenie listy nierozwijanej (listboxa)
		ListBox nazwa_listboxa = new ListBox();
		// dodawanie wartości więcej niż jednej do listboxa 
		nazwa_listboxa.Items.AddRange(new object[] { "Wartosc 1", "Wartosc 2", "Wartosc 3", "Wartosc 4", "itd." } );
		
		// tworzenie listy rozwijanej (combobox)
		ComboBox nazwa_comboboxa = new ComboBox();
		nazwa_comboboxa.Location = new Point(0, 250);
		// tekst na komboboxie (nie jest on brany jako wartość comboboxa, tzn.
		// po wybraniu, której z wartości, ten tekst zniknie)
		nazwa_comboboxa.Text = "Wartości wpisane w comboboxie";
		// dodawanie wartości więcej niż jednej do comboboxa (tak samo jak w listboxie)
		nazwa_comboboxa.Items.AddRange(new object[] { "Wartosc 1", "Wartosc 2", "Wartosc 3", "Wartosc 4", "itd." } );
		
		// wzór dodawania wielu komponentów za jednym razem
		nazwa_formatki.Controls.AddRange(new Control[] { nazwa_listboxa, nazwa_comboboxa });

		// Deklaracja zdarzeń:
		// zdarzenie Paint - oznacza, ze na komponencie bedzie mozna rysowac
		// O pisaniu innego typu zdarzen niz Resize, Click i Paint nie bede pisal.
		// Poza tym zdarzenia to dosyc rozlegly, ale nietrudny rozdzial :)

		// rysowac bedziemy na formatce glównej (this)
		this.Paint += new PaintEventHandler(bierzemy_sie_za_rysowanie);

		// zdarzenie resize będzie nam odświeżalo okno podczas zmiany rozmiarów
		this.Resize += new EventHandler(Odswiezanie);

		// obsluga myszy
		nazwa_formatki.MouseMove += new MouseEventHandler(ruch_myszki);
		wspolrzedne_myszki.Location = new Point(nazwa_formatki.Width-150,nazwa_formatki.Height-80);
		wspolrzedne_myszki.Size = new Size(100,50);
		nazwa_formatki.Controls.Add(wspolrzedne_myszki);

	}

	/* Deklaracja metody (w tym przypadku wywołanego przez jakieś zdarzenie).
		Są dwa specyfikatory dostępu dla metod:
		public - składnik dostępny jest również poza klasą;
		private - (przeciwieństwo public) składnik nie dostępny jest również poza klasą.
	   Slowo "void" mówi kompilatorowi, że funkcja nie zwraca żadnych wartości. */
	public void zdarzenie_buttona(object sender, EventArgs e)
	{
		// Zróbmy, że klikając na button zmieni się kolor nowej formatki
		// Stwórzmy od razu proste warunki i iteracje, dzięki którym, za każdym
		// razem jak klikniemy na button, coś się zmieni.
		// Można robić to na wiele sposobów, ja napisałem to akurat w ten :)
	    
		if (x%2 == 0) // jeżeli wynik z dzielenia przez 2 = 0, wtedy zrób to...
		{
			// tu mozna wypisywac cokolwiek co chce sie zmienic, podobnie w warunku "else"
			nazwa_formatki.BackColor = Color.PaleGreen;
		}
		else // w innym wypadku...
		{
			nazwa_formatki.BackColor = Color.FromArgb(220,220,210);
		}
		x++; // z wywołaniem tej metody x rośnie o 1
	}

	public void bierzemy_sie_za_rysowanie(object sender, PaintEventArgs nazwa_argumentu_grafiki)
	{
		// wszystko będzie rysowane na 
		// zainicjowanie grafiki
		Graphics grafika = nazwa_argumentu_grafiki.Graphics;

		// wprowadzenie wygładzania rysunków, w tym przypadku grafika będzie
		// rysowana z najwyższą dokładności, jednak bardzo to zwalnia program
		grafika.SmoothingMode = SmoothingMode.HighQuality;

		// Rysowanie tekstu:
		Font czcionka = new Font("Arial", 12);
		grafika.DrawString("jakiś tekst", czcionka, new SolidBrush(Color.Black), ClientSize.Width-100, ClientSize.Height/2-20);

		// NA POCZĄTKU NAUCZYMY SIĘ RYSOWAĆ FIGURY ZA POMOCĄ OŁÓWKA (pen)

		// pen jest również obiektem, więc trzeba go stworzyć
		Pen olowek_bialy = new Pen(Color.White);

		// narysowanie strzalki (lub innych obiektow) na koncu linii:
		olowek_bialy.EndCap = LineCap.ArrowAnchor;

		// grubośc linii:
		olowek_bialy.Width = 5;

		// rodzaj linii (np. linia przerywana):
		olowek_bialy.DashStyle = DashStyle.Dot;
		
		// Mamy już ołówek, więc możemy nim rysować rożne figury. Dla kazdego
		// obiektu tworze rozne olowki, aby latwo bylo sie zorientowac na formatce co do czego,
		// ale ciagle mozna uzywac tego samego jednego olowka.

		// rysowanie prostej linii (czym ma rysowac, polozenie poczatkowe od lewej, polozenie poczatkowe od gory, polozenie koncowe od lewej, polozenie koncowe od gory)
		grafika.DrawLine(olowek_bialy,0,0,this.Width-100,this.Height-100);

		// rysowanie prostokąta (dla kwadratu szerokosc = wysokosc) niewypełnionego (czym ma rysowac, polozenie od lewej, polozenie od gory, szerokosc, wysokosc)
		Pen olowek_czerowny = new Pen(Color.Red);
		grafika.DrawRectangle(olowek_czerowny,10,10,100,40);

		// rysowanie elipsy (dla koła szerokosc = wysokosc) niewypełnionej (czym ma rysowac, polozenie od lewej, polozenie od gory, szerokosc, wysokosc)
		Pen olowek_czarny = new Pen(Color.Black);
		grafika.DrawEllipse(olowek_czarny,10,80,50,80);

		// rysowanie łuku (czym ma rysowac, polozenie od lewej, polozenie od gory, szerokosc, wysokosc, kat 1, kat 2)
		Pen olowek_zloty = new Pen(Color.Gold);
		grafika.DrawArc(olowek_zloty,300,250,103,35,10,90);

		// rysowanie krzywej Beziera (używana do wektorowego zapisu grafiki komputerowej)
		Pen olowek_rozowy = new Pen(Color.Pink);
		grafika.DrawBezier(olowek_rozowy,40,20,50,77,10,140,190,180);

		// rysowanie dowolnych figur
		Pen olowek_zielony = new Pen(Color.Green);
		Point[] punkty = new Point[5] 
		{
			new Point(214, 34),
			new Point(314, 100),
			new Point(424, 67),
			new Point(240, 60),
			new Point(100, 40),	
		};
		grafika.DrawPolygon(olowek_zielony, punkty);

		// Inne rozne figury, ktore mozna rysowac za pomoca olowka mozna znalezc w pomocy
		// albo w podpowiedziach, ktore pojawiaja sie zaraz po napisaniu "grafika.".


		// TERAZ BEDZIEMY RYSOWAC Z FIGURY Z WYPELNIENIEM
		// 1) Najpierw definiujemy czym maly wypelnic
		// 2) Definiujemy co mamy wypelnic

		// zdefiniowanie samego koloru do wypelniania
		SolidBrush sam_kolor = new SolidBrush(Color.Black);
		
		// rysowanie wypelnionego prostokata
		grafika.FillRectangle(sam_kolor, 10, 250, 30, 20);	

		HatchBrush wzorki = new HatchBrush (HatchStyle.ZigZag, Color.Wheat, Color.Transparent);
		grafika.FillEllipse(wzorki, 350, 250, 40, 30);	
		
		// mozna tez rysowac w ten sposob:
		grafika.FillEllipse(new SolidBrush(Color.White), 200,250,30,50);


		// Z grafiki to tyle, aha. Może jeszcz powiem jak się dodaje obrazki. Nic prostszego :)
		// Rysowac obrazki mozna az na 30 sposobow!!!	
		// jezeli wyskoczy blad, to znaczy, ze nie musicie zmienic sciezke dostepu do obrazka
		grafika.DrawImage(Image.FromFile("c:/windows/Bąbelki.bmp"), Width-50, 10, 40, 80);

	}
	
	private void ruch_myszki(object sender, MouseEventArgs wartosc)
	{

		wspolrzedne_myszki.Text = "wspolrzedne x: "+wartosc.X+"n wspolrzedne y: "+wartosc.Y;
	
	}

	private void Odswiezanie(Object sender, EventArgs e)
	{
		Invalidate();
	}

	// Od tej meotdy zaczyna się działanie programu.
	private static void Main()
	{
		// która metodą ma wykonywać jako główną
		Application.Run(new Wprowadzenie());
	}
}

9 komentarzy

chcialem zaznaczyc ze uruchomilem i dziala

a ja jestem kompletnie zielony i poprosze pomoc w uruchomieniu tego na visual studio 2005 jak wczytam plik rozumiem to dac do pliku z rozszerzeniem .cs jako class natomiast nie umiem tego skompilowac no chyba ze z lini komend a jak sie ma sprawa z windowsowa wersja , dla mnie to na razie czarna magia ale pewnie dla kogos to latwe i moze zaoszczedzic mi grzebania wielogodzinnego , jak sie robi nowy projekt to jest ok bo samo srodowisko dba co i jak dolaczyc i gdzie ale jak sie ma 1 plik to ja nie umiem go uruchomic

Bardzo mi sie podoba ten język, życzę mu wszystkiego najlepszego :)

Z tego co zauważyłem to programy troche wolno sie włączają za pierwszym razem (pośrednia kompilacja czy coś takiego ?) no i trzeba mieć tego nieszczęsnego frameworka na kompie (co w praktyce == WinXP SP2).. ale poza tym jest spoko :)

hehe - jaki ja nieświadomy byłem półtora roku temu :) a teraz za kasę w C# klepię :D ależ czas pędzi...

Ja tylko wspomnę o www.go-mono.pl :)
I jeszcze jedno: C# to chyba klon javy... Napisałem program w C# i chciałem go przerobić na kod javy... Zmian było dosłownie kilka :)

Tutorial napisałem dla kilku osób na studiach, dlatego jest taki frywolny ;)
Co do samego języka, to C#, podobnie jak Java, został stworzony do kreacji wieloplatformowego kodu. Ale pochodzi z rodziny C i C++, a nie Javy, chociaż wiele rzeczy jest identycznych. Tym co ma C# a nie ma Java, jest to, że język ten umożliwia łatwą współpracę kodu napisanego w języku z kodem napisanym w innym języku. Poza tym C# i Windows są bardzo blisko związane ze sobą (Java, niestety, nie ma pełnej integracji z systemem). Język jest bardzo przyjemny.
Gwoli informacji, to niedawno wyszła polska wersja C# pod platformę .NET.

Ja rozumiem :> , ale w końcu co to jest ten hasz (#) kompresja ++ (lze?). Nie no spoko, tylko zartuję. Zaraz ściągnę sobie kompilator. Fajny art. Ja chcę więcej!!!

Widzę, że C# bardzo mocno przypomina Javę.

Brakuje tagów <cpp> - pomimo innego języka tutaj najprawdopodobniej by się sprawdziły i polepszyłyby czytelność artu.

Poza tym - artykuł dobry.

Nie wiem, czy nie lepiej byłoby go wrzucić do działu C++, chociaż "Z pogranicza" może i jest lepszym wyborem...

Prosze, podczas pisania artykulow, kody zrodlowe wpisuj pomiedzy znaczniki <cpp> oraz </cpp>. Ufff....