/*
* 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());
}
}
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....