Elemente de programare C++ C#
  • Tematica
  • Noi notiuni, functii si instructiuni utilizate
  • Elemente de baza


    Program de calculator

        Set de instructiuni scris de programatori in vederera rularii pe un calculator.

    Limbaj de programare

        Este un set bine definit de expresii si reguli (sau tehnici) valide de formulare a instructiunilor pentru un computer. Un limbaj de programare are definite un set de reguli sintactice si semantice.

    Limbajul de programare C

        Limbajul C a fost creat la īnceputul anilor '70 de catre Brian W Kernigham si Dennis M Ritchie de la Bell Laboratories New Jersey
        Caracteristicile distinctive ale limbajului au fost clar definite de la īnceput, ele pastrīndu-se īn toate dezvoltarile ulterioare:
        Este un limbaj de o importanta cruciala in lumea programarii, drept pentru care exista o serie de variante standardizate. Cel mai important standard ce ofera o variana standardizata a limbajului C este standardul ANSI

  • Primul program ANSI C

       
    // Primul program scris in Visual C++ de tipul:ANSI C
    
    #include "stdafx.h"
    #include < stdio.h >
    int main() {
    	char c[1];
    	printf("Bine ati venit la cursul de : Programarea calculatoarelor!");
    	gets(c);
    	return 0;
    }
       
    

        Acest program afiseaza mesajul: "Bine ati venit la cursul de : Programarea calculatoarelor!".


        De obicei un program nu "incepe de la 0", in sensul ca un programator trebuie sa se concentreze asupra problemei de rezolvat si nu asupra lucrurilor de rutina de genul cum sa afisez ceva pe ecran. Exista o serie de "programe" numite functii grupate in biblioteci si care rezolva problemele des intalnite. Astfel prima linie indica faptul ca se folosesc functii de intrare / iesire, iar descrierea modului de utilizare (numele, tipul argumentelor, tipul valorii returnate etc) a acestora se afla īn fisierul cu numele stdio.h . Programul scris de programator va fi gazduit tot intr-o functie. Fiind cea mai importanta functie, ea se numeste functia main si va contine instructiunile programului. In cazul programului de sus, cea mai importanta instructiune este un apel al functiei printf care afiseaza un mesaj la terminal. Mesajul este dat īntre ghilimele si se termina cu un caracter special new-line (\n). Daca programul ar contine numai aceasta linie, s-ar afisa mesajul pe consola standard (ecranul) dupa care fereastra in care se afiseaza acest mesaj dispare si practic nu vedem nimic. Se mai introduce si apelul functiei gets() care asteapta introducerea unui text de la dispozitivul satandard de intrare adica tastatura. Textul introdus va fi pastrat in variabila c pe care am definit-o in prima instructiune ca fiind de tip char (un sir de caractere de lungime 1). Functia gets() asteapta un text care sa se termine cu Enter. Cum in cazul de fata nu astept decat apasarea unei taste, este suficient sa apas tasta Enter. Din acest motiv am definit constanta c, de tip caracter de lungime 1. Instructiunea return preda controlul sistemului de operare la terminarea programului si comunica acestuia codul 0 pentru terminare. Prin conventie, aceasta valoare semnifica terminarea normala a programului – adica nu au aparut erori īn prelucrarea datelor. Corpul functiei main apare īntre acolade. Orice program C trebuie sa aiba o functie main.
        Functia gets() asteapta introducerea unui text, care in prealabil trebuie definit. Avand in vedere ca in programul de sus nu ne intereseaza textul introdus, am putea folosi o functie care asteapta introducerea unui caracter indiferent care. Functia se numeste getch() si se gaseste in biblioteca "conio.h"

       
    #include "stdafx.h"
    #include < stdio.h >
    #include < conio.h >
    int main() {
    	printf("\n\tS-a utilizat functia getch() pentru a astepta apasarea unui caracter");
    	printf("\n\n\n\t\tApasati orce tasta pentru iesire!\a");
    	getch();
    	return 0;
    }
       
    


        Dupa cum se vede, s-au folosit caracterele speciale : \n;\t;\a; Caracterul special \n determina cursorul sa avanseze pe un rand nou, \t determina cursorul sa avanseze un tab iar \a emite un sunet scurt.

  • Programare in C++

        Programele C care respecta standardul ANSI C pot fi rulate pe orice mediu de programare C si sub orice sistem de operare.
        Din pacate nucleul C standard ANSI C nu este acoperitor pentru diferite implementari mai noi de tip Object-Oriented Programming (OOP) si "Visual".
        C++ include noi tehnici procedurale de programare. Daca programarea clasica in C este o programare structurata modulara , programarea C++ include si programarea orientata obiect OOP . Obiectele sunt noi tipuri ce integreaza atat datele cat si metodele asociate crearii, prelucrarii si distrugerii acestor date. Un obiect este definit de o clasa. Clasa reprezinta structura care defineste caracteristicile abstracte ale unui obiect.
        O clasa contine functii si date numite functii membru respectiv date membru. Functiile membru se mai numesc si metode. Lansarea unei functii membru se mai numeste si invocarea unei functii membru. Un obiect se obtine prin instantierea unei clase. Prin instantierea unei clase, se obtine deci un obiect sau o instanta. Clasa este un concept de baza al programarii orientate obiect.
        Vom folosi in continuare mediului de programare: Visual Studio , fiind un mediu OOP Visual.
        Va trebui deci sa analizam si extensiile limbajului C implementate in Visual C++ , mediu ce ne va permite sa utilizam facilitatile OOP si Visual.
        Sa luam de exemplu aplicatia de mai jos:

       
    // Primul program scris in Visual C++  
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	cout <<" Primul program scris in Visual  C++  \n\n Felicitari!!";
    	cin.get();
    	return 0;
    }
       
    

        Programul ruleaza in fereastra "Command" pe un fundal negru cu caractere albe. Exista posibilitatea schimbarii atributelor ferestrei "Command" din program. Putem schimba de exemplu culorile, titlul ferestrei, etc. Urmatoarea aplicatie reia aplicatia de sus dar cu cateva modificari de atribute ale ferestrei "Command" .

       
    // Program scris in C++ Visual Studio  
    // Se afiseaza un text si se modifica diverse atribute ale ferestrei "Command" .
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	system("TITLE Afisare text culoare albastra pe fundal alb ");// Titlul ferestrei consola
    	system("COLOR F9"); // Fundal alb caractere albastre
    	cout <<" \n\n\tAti tiparit un text albastru pe un fundal alb. \n\n\t Succes in continuare !!";
    	cin.get();
    	return 0;
    }
       
    


        In instructiunea: system("color F9"); , prima cifra reprezinta culoarea fundalului iar cifra a doua reprezinta culoarea textului dupa cum urmeaza:

    • 0 = Black
    • 1 = Blue
    • 2 = Green
    • 3 = Aqua
    • 4 = Red
    • 5 = Purple
    • 6 = Yellow
    • 7 = White
    • 8 = Gray
    • 9 = Light Blue
    • A = Light Green
    • B = Light Aqua
    • C = Light Red
    • D = Light Purple
    • E = Light Yellow
    • F = Bright White


        Dupa rularea aplicatiei obtinem:




  • Structura unui program in C++


        Sa analizam structura programului afisat mai jos:

       
    // Primul program scris in Visual C++ l:CLR (Common Language Runtime) console application
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	cout <<" Primul program CLR console application\n\n Felicitari!!";
    	cin.get();
    	return 0;
    }
       
    


    Comentarii

        Sunt precedate de // si pot aparea oriunde in program. Nu sunt executate de calculator, ele fiind destinate celor care scriu sau citesc programele.
        Comentariile sunt plasate in vederea explicitarii programelor si pentru intelegerea mai usoara a programelor de catre alti programatori sau chiar de autorul programului. In cazul de fata linia de comentariu :

         // Primul program scris in Visual C++ de tipul:CLR (Common Language Runtime) console application

    da informatii despre mediul de programare in care a fost scris programul.

    Directiva #include

        C++ contine un numar de fisiere de biblioteca standard unde sunt incluse functii si obiecte utilizate frecvent. Aceste fisiere sunt sunt grupate in biblioteci
    #include < iostream > include biblioteca iostream ce contine functii si obiecte pe care le vom folosi in functia main , de exemplu cout >>
        In cazul in care avem mai multe biblioteci de inclus sau daca pentru orce program trebuie neaparat sa includem niste biblioteci, in loc de numele biblotecii se poate indica un fisier ce contine toate numele biblotecilor. Fisierul are de obicei extensia .h .In cazul primului program scris anterior, #include "stdafx.h" include bibliotecile si directivele de compilare scrise in fisierul stdafx.h

       
    // stdafx.h : include file for standard system include files,
    // or project specific include files that are used frequently, but
    // are changed infrequently
    //
    
    #pragma once
    
    
    #define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
    #include < stdio.h> 
    #include < tchar.h> 
    
    
    // TODO: reference additional headers your program requires here
       
    

    #include < iostream > ar putea fi inclusa in fisierul stdafx.h, in acest caz ne mai fiind nevoie s-o includem in programul principal.
        Tot aici ar putea fi incluse functiile definite de utilizator. Sa presupunem ca dispunem de functia afis_binar_8 pentru afisarea in format binar pe 8 biti. Ea poate fi inclusa in fisierul stdafx.h, in acest caz continutul acesteia devenind:

       
    // stdafx.h : include file for standard system include files,
    // or project specific include files that are used frequently, but
    // are changed infrequently
    //
    #pragma once
    // TODO: reference additional headers your program requires here
    #include < iostream >
    using namespace std;
    static void afis_binar_8(int n)
    {
    	int i;
    	char val_b[8];
    	for (i=0; i < 8; i++){
    		if (n%2==0)
    			val_b[7-i]='0';
    		else
    			val_b[7-i]='1';
    		n=n/2;
    	}
    	// afisare binara
    	
    	for (i=0; i < 8; i++){
    		cout << val_b[i] << " ";
    	}
    	// prompter pe prima pozitie
    	
    	for (i=0;i < 17; i++){
    		cout << "\b";
    	}
    }
       
    


        Programul principal fiind in acest caz extrem de simplu si uor de inteles, acesta continand in general numai apeluri de functii. Continutul acestuia fiind urmatorul:

       
    // Afisare binara utilizand functia afis_binar_8
    #include "stdafx.h"
    int main(void)
    {
    	system("TITLE Afisare sub forma binara ");// Titlul ferestrei consola
    	system("COLOR F9");// Albastru pe fond alb
    	cout<<"\n\n\tAfisarea valorii 147 sub forma binara: \n\n\t  ";
    	afis_binar_8(147);
    	cout<<"\n\n\tApasati Enter pentru iesire! ";
    	cin.ignore();
    	cin.get();
    	return 0;
    }
       
    


        Dupa rularea programului obtinem:



        Functia "afis_binar_8" poate fi inclusa direct in program inantea functiei "main" astfel:

       
    // Afisare binara utilizand functia afis_binar_8
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    static void afis_binar_8(int n)
    {
    	int i;
    	char val_b[8];
    	for (i=0; i < 8; i++){
    		if (n%2==0)
    			val_b[7-i]='0';
    		else
    			val_b[7-i]='1';
    		n=n/2;
    	}
    	// afisare binara
    	
    	for (i=0; i < 8; i++){
    		cout << val_b[i] << " ";
    	}
    	// prompter pe prima pozitie
    	
    	for (i=0;i < 17; i++){
    		cout << "\b";
    	}
    }
    
    int main(void)
    {
    	system("TITLE Afisare sub forma binara ");// Titlul ferestrei consola
    	system("COLOR F9");// Albastru pe fond alb
    	cout<<"\n\n\tAfisarea valorii 147 sub forma binara: \n\n\t  ";
    	afis_binar_8(147);
    	cout<<"\n\n\tApasati Enter pentru iesire! ";
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    
    


    Functia main

        Functia este un grup de instructiuni scrise in vederea realizarii unei sarcini. Functia este referita prin nume. In cazul primului program scris mai sus, main este numele functiei principale. Un program poate avea mai multe functii si de aceeea functia care se lanseaza prima in cadrul executiei programului trebuie sa poarte denumirea main

    Spatiul de nume

        Instructiunea using namespace std; este un spatiu de nume. C++ foloseste spatii de nume (namespaces) pentru a organiza clase cu functionalitati inrudite, folosite in cadrul programelor. Si bibliotecile folosesc spatii de nume , astfel clasele din biblioteca sunt referite prin intermediul spatiului de nume.

    Corpul functiei

        Toate instructiunile functiei sunti incluse in corpul functiei. Un corp de functie incepe cu { si se termina cu } De obicei fiecare instructiune se termina cu ; In cazul primului program scris anterior:
       
    // Primul program scris in Visual C++ l:CLR (Common Language Runtime) console application
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	cout <<" Primul program CLR console application\n\n Felicitari!!";
    	cin.get();
    	return 0;
    }
       
    

    functia main contine cele trei instructiuni afisate mai jos. Instructiunile se executa secventiial de sus in jos.

       
    
    	cout <<" Primul program CLR console application\n\n Felicitari!!";
    	cin.get();
    	return 0;
       
    

        Instructiunea cout << afiseaza pe consola standard ,Textul : "Primul program" pe randul 1 iar pe randul 3 textul: Felicitari. \n comanda trecerea pe randul urmator. La inceput cursorul se afla pe randul 1 unde va scrie textul : "Primul program" . Dupa secventa \n\n cursorul se muta pe randul 3 unde va scrie textul : "Felicitari !!"



        In cadrul textului se pot insera deci caractere de control. Exista o serie de caractere de control, cele mai utilizate fiind:

    Nume Descriere Definire cu esc in C
    nul null byte \0
    bel bell character \a
    bs backspace \b
    ht horizontal tab \t
    np formfeed \f
    nl newline \n
    color color \033


        Schimbarea culorii textului se face folosind caracterul de control \033 urmat de codul culorii.
        Cateva coduri de culoare text se afla in tabelul de mai jos:

    Culoare Cod
    Alb \033[0m
    Rosu \033[31m
    Verde \033[32m
    Galben \033[33m
    Albastru \033[34m
    Magenta \033[35m
    Cyan \033[36m



        Aplicatia urmatoare schimba culoarea textului. Pentru activarea acestor coduri este necesara invocarea in prealabil a istructiunii system("Color 0F");

    
    #include "stdafx.h"
    #include < iostream >
    #include < string >
    using namespace std;
    int main() {
            system("Color 0F");
            cout << "\n\n\tAplicatia utilizeaza diferite culori\n\n\t";
            cout << "\033[31m" << "Rosu: " << "\033[36m" << "Cyan: \n\n\t";
            cout << "\033[0m" << "Alb: " << "\033[32m" << "Verde: \n\n\t" ;
            cout << "\033[35m" << "Magenta: " ;
            cout << "\033[33m" << "Galben: " ;
            cin.ignore();
            cin.get();
            return 0;
    }
    
    




        Declaratia cin.get(); reprezinta invocarea metodei get a obiectului cin. Pentru precizarea metodei get au fost deci necesare precizarea tuturor componentelor adica:

         obiect . metoda

        In cazul ca spatiul de nume nu este prezentat in antet,atunci forma generala este:

         spatiu de nume :: obiect . metoda

        Metoda get(); asteapta apasarea tastei Enter. Invocarea acestei metode este necesara deoarece dupa scrierea textului pe consola, aceasta ar disparea foarte repede fara sa ajungem sa citim textul afisat. Textul afisat ar trebui completat cu mesajul: "Tastati Enter"
        Daca nu am fi folosit spatiul de nume using namespace std;, instructiunile din corpul functiei main ar fi trebuit scrise:

       
    
    	std::cout <<" Primul program CLR console application \n\n Felicitari!!";
    	std::cin.get();
    	return 0;
       
    

    Practic primul programul, dupa modificarea stadfix.h , poate sa arate astfel:

       
    // Primul program scris in Visual C++ de tipul:CLR console application
    
    #include "stdafx.h"
    #include < iostream >
    
    int main(void)
    {
    	std::cout <<" Primul program  CLR console application\n\n Felicitari!!\n\n Tastati Enter";
    	std::cin.get();
    	return 0;
    }
       
    

        Invocarea metodei get(); are rolul de a astepta apasarea unei taste altfel fereastra consola in care se afiseaza textul dispare fara a avea timp sa citim textul afisat.
        O alta metoda care ne permite sa citim textul afisat, este reprezentata de folosirea functiei Sleep() care determina "inghetarea" programului pentru un timp determinat, astfel avem timp sa citim cosola. Functia are nevoie de un parametru exprimat in milisecunde reprezentand timpul de asteptare.
    Functia Sleep se gaseste in biblioteca "windows.h" si trebuie inclusa cu directiva include astfel:
    #include < windows.h >

       
    // Programul  utilizeaza functia sleep din biblioteca 
    
    #include "stdafx.h"
    #include < iostream >
    #include < windows.h >
    using namespace std;
    
    int main(void)
    {
    	cout << " Va urez o zi buna!!";
    	Sleep(1000);
    	cout << " \n\n\t Salut!!";
    	Sleep(500);
    	return 0;
    }
       
    

    Pentru a nu mai incarca biblioteca "windows.h" se poate folosi functia _sleep() inclusa in < iostream >

       
    // Programul  utilizeaza functia sleep din biblioteca 
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	cout << " Va urez o zi buna!!";
    	_sleep(1000);
    	cout << " \n\n\t Salut!!";
    	_sleep(500);
    	return 0;
    }
       
    

    Functii definite de utilizator

        Utilizatorul poate scrie propriile functii care vor fi incluse in program alaturi de functia main .
        Vom realiza o aplicatie in care vom defini si vom folosi functia afis_l care afiseaza mai multe liniute pentru a realiza aplicatia:


       
    #include "stdafx.h"  
    #include < iostream >
    using namespace std;
    
    void afis_l(int nr_l){
    	for(int i=0;i < nr_l;i++)
    		cout << "-";
    	cout << "\n";
    }
    
    int main()
    {
    	afis_l(19);
    	cout << "  Bine ati venit! \n";
    	afis_l(19);
    	cout << "\n\n\t\t Succes!\n\t\t";
    	afis_l(9);
    	cin.get();
    	return 0;
    }
       
    

        Dupa cum se observa, functiile definite de utilizator sunt plasate in fata functiei main

        Vom realiza o noua aplicatie in care vom defini si vom folosi functia nr_p care returneaza patratul unui numar:

       
    #include "stdafx.h"  
    #include < iostream >
    using namespace std;
    
    int nr_p(int x){
    	int np;
    	np=x*x;
    	return np;
    }
    
    int main()
    {
    	cout << "  \n\n Patratul numarului 4 este:";
    	cout << nr_p(4);
    	cout << "  \n\n Patratul numarului 9 este:" << nr_p(9);
    	cin.get();
    	return 0;
    }   
    

        Dupa cum se observa, functia cere un parametru si returneaza un parametru

    Utilizare Visual Studio


    Vom utiliza in continuare un mediu de dezvoltare integrat IDE( Integrated Developement Environment) Microsoft Visual Studio.
    Acest mediu de dezvoltare dispune de o interfata grafica GUI (Graphics User Interface) ce contine: IDE-uri similare:Borland C++ Builder, IBM VisualAge, etc.

    Viitorele aplicatii dezvoltate in cadrul acestui curs vor putea fi rulate utilizand oricare din versiunile Microsoft Visual Studio 2005 - 2022.


    Versiunea Microsoft Visual Studio Community poate fi descarcata de la adresa:

    https://visualstudio.microsoft.com/vs/community/

         Se va utiliza C++ pentru aplicatii consola si C# pentru aplicatii windows. La instalare vor fi bifate cel putin urmatoarele elemente:


         Se lanseaza Visual Studio si vom incepe prin crearea unui nou proiect.


         Se pot utiliza si versiuni mai vechi incepand cu Visual studio 2005.




  • Realizarea proiectelor C++ de tipul CLR Console Application

        Primul proiect realizat va fi un proiect de tip "Console App" care presupune:


        Versiunile mai vechi, presupun:


        Dupa care se alege - Visual C++ CLR (Common Language Runtime)-CLR Console Application si se completeaza numele proiectului, in cazul de fata Primul_pr


    Scrierea codului sursa

         - Se alege fisierul Primul_pr.cpp
         - Se scrie codul sursa al programului primul_pr


        Versiunile mai vechi:



    Constructia proiectului:     Build-> Build solution

    Rularea codului:    Debug->Start Debugging

        Cele doua operatii pot fi lansate si prin folosirea butonului rapid incercuit cu rosu in imaginile de sus.


        Versiunile mai vechi:



    Spatiul de nume System



  • Notiuni utilizate in OOP

        Apelarea unei metode (functi membru) sau setarea unei proprietati, ale unui obiect se face prin precizarea tuturor componentelor si anume:

    nume_aplicatie.nume_form.nume_obiect.metoda sau proprietate

        Componentele nume_aplicatie.nume_form pot fi inlocuite cu this deci precizarea unei metode sau a unei proprietati, devine:

    this.nume_obiect.metoda sau proprietate



  • Realizarea proiectelor C# Console Application folosind spatiul de nume System




        Spatiul de nume System contine clase fundamentale, metode de clasa, interfete, metode pentru manipulare a evenimentelor. Folosind acest spatiu, avem posibilitatea de a utiliza diverse metode pentru a defini si converti diferite tipuri de date necesare in programarea de tip "Visual" pe care o vom utiliza in cadrul modulului Windows Forms Application.
        Spatiul de nume System contine si metode pentru consola, putand astfel sa dezvoltam atat aplicatii de tipul CLR Console Application cat si aplicatii de tipul Windows Forms Application. Metodele pentru consola se gasesc in clasa Console Functiile definite in interiorul unei clase poarta numele de metode ale clasei. Apelarea unei metode (functi) definite in cadrul unei clase se face prin precizarea tuturor componentelor si anume:

    spatiul de nume.clasa.metoda ( )

        Pentu a apela functia ReadLine de exemplu vom utiliza: Console.ReadLine()
        Declaratia de mai sus poate fi citita si astfel: "Se invoca metoda ReadLine a clasei Console aflata in spatiul de nume System .
        Pentru a afisa de exemplu textul :" Succes la examene !! " , vom invoca metoda WriteLine a clasei Console aflata in spatiul de nume System .
        Mai jos se prezinta un program de tipul Console Application, program ce invoca metode din clasa Console din spatiul de nume System .

        C#

       
    using System;
    namespace sp_system
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Program C # ce utilizeaza spatiul de nume System");
                Console.ReadLine();
            }
        }
    }
       
    



  • Realizarea proiectelor Visual C# Windows Forms Application


        Mediul de programare "Visual Studio " este un mediu visual de programare orientata obiect(OOP), permitand realizarea de aplicatii OOP folosind modul "Visual". Obiectele dorite sunt plasate pe o planseta de design (form) dupa care sunt completate si adaugate diverse secvente de cod pentru a stabili comportarea dorita pentru obiectul plasat.

        Pentru realizarea proiectelor Windows Form Application (WFA) vom folosi limbajul de programare C Sharp (C#).


    - Plasare buton Start

    Din ToolBox se alege All windows Forms--Button si se plaseaza pe Form-ul deschis.
    Se selecteaza butonul plasat pe Form cu click dreapta si se alege din meniul deschis optiunea "Properties"
    Se selecteaza propietatea "Text" si i se va atribui valoarea "Start". In acest moment pe buton va scrie "Start"
    Se selecteaza de aceasta data Formul cu click dreapta, se alege din meniul deschis optiunea "Properties"
    Se selecteaza propietatea "Text" si i se va atribui valoarea "Primul Form". In acest moment titlul ferestrei principale va fi:"Primul program Win Form App"



    - Plasare label

    Din ToolBox se alege All windows Forms--Label si se plaseaza pe Form-ul deschis.
    Se selecteaza label-ul plasat pe Form cu click dreapta si se alege din meniul deschis optiunea "Properties"
    Se selecteaza propietatea "Text" si i se va atribui valoarea "Mesaj". In acest moment pe buton va scrie "Mesaj"

    - Scrierea codului

    Daca selectam butonl start cu click dreapta si se alegem din meniul deschis optiunea "Properties" gasim la proprietatea Name setat numele button1, atribuit automat la plasarea butonului. La fel pentru labelul pe care am setat textul mesaj, vom gasi numele label1
    Ne propunem sa scriem un program care sa afiseze textul:"Primul program C# Windows Forms Application" la apasarea butonului "Start".
    Se selecteaza butonul "Start" cu click dreapta si se alege din meniul deschis optiunea "Properties". Se apasa butonul "Events".
    Se alege Action--Dublu click pe optiunea Click.In acest moment evenimentului "click" al butonului "Start" i se genereaza un schelet de procedura care va trata evenimentul click al butonului button1 numita: button1_click pe care trebuie sa-l completam cu liniile de instructiune necesare pentru a trata evenimentul click.In cazul de fata: cu instructiunea:
    this.label1.Text="Primul program C# Windows Forms Application";
    adica pe formul curent (this) obiectului label1 sa atribuim proprietatii Text valoarea : "Primul program C# Windows Forms Application"
    Procedura care trateaza evenimentul click va fi deci:

       
            private void button1_Click(object sender, EventArgs e)
            {
                this.label1.Text = "Primul program C# Windows Forms Application";
            }
       
    


    - Rulare aplicatie

    In acest moment prin apasarea butonului "Start debug" se lanseaza aplicatia si putem apasa butonul "Start" din aplicatie. Dupa aceste operatii, ecranul aplicatiei arata astfel:




    - Modificare atribute

    Revenim la Form Design si modificam diferite proprietati (atribute) ale obiectelor amplasate pe form .
    Sa modificam de exemplu BackColor pentru fereastra principala:



    Putem modifica dupa preferinta proprietatile tuturor obiectelor amplasate pe form. Putem modifica de exemplu Fonturile si culoarea mesajului.


    - Varianta finala


    Dupa ce am efectuat toate modificarile si am testat aplicatia, in Folder-ul project gasim Folderul:primul_form apoi in Folderul debug: gasim executabilul "primul_form.exe" pe care il putem lansa in executie.



    Afisare valori numerice, valori numerice aleatoare in C# WFA


        Am afisat in aplicatia anterioara un text. Vom incerca sa afisam valori numerice in aplicatia urmatoare: random_00
        Afisarea se va face tot intr-un obiect de tip "label", insa vom tine cont ca in acest obiect se pot afisa numai texte, deci vom folosi metoda "ToString" pentru a converti un numar intr-un text.
        Numarul afisat va fi un numar generat aleator.
        Pentru a obtine valori aleatoare, vom crea un obiect n prin instantierea clasei "System.Random" si vom invoca metoda "Next".
        Plasam un obiect de tip "button" cu proprietatea Text="Nr aleator" si un obiect de tip "label", dupa care creem evenimentul "Click" pe obiectul button1.
        Completam procedura creata pe evenimentul click a obiectului button1 cu:

       C#
            private void button1_Click(object sender, EventArgs e)
            {
                System.Random n;
                n = new System.Random();
                this.label1.Text = n.Next(1000).ToString();
            }
    




    Timere in C# WFA


        De multe ori in aplicatii e nevoie sa se execute un anumit cod de program, la intervale prestabilite de timp. Timer-ele ne permit sa declansam executia unuei secvente de cod la intervale de timp prestabilite.
        Pentru a afisa la intervale de 1000 ms un nou numar aleator intr-un obiect de tip "label", vom crea proiectul: timer_00 .
         Vom utiliza un biect de tip "timer", obiect care nu mai este vizibil pe form, va rula "in spatele form-ului" si va la declansa la intervale prestabilite, codul de program atribuit evenimentului "Tick"". Obiectul "timer" are posibilitatea setarii intervalului intre evenimente numite Tick


        Completam procedura creata pe evenimentul "Tick" a obiectului timer1 cu:

       C#
    	private void timer1_Tick(object sender, EventArgs e)
            {
                System.Random n;
                n = new System.Random();
                this.label1.Text = n.Next(1000).ToString();
            }
    


    Trasarea figurilor grafice elementare in C# WFA


        Vom desena in continuare diverse forme geometrice pe ecran.
        Deschidem un nou proiect Windows Forms Application intitulat f_geom si plasam un buton cu proprietatea Text="Deseneaza", dupa care creem evenimentul "Click".
        Completam procedura creata pe evenimentul click a obiectului button1 cu

       C#

            private void button1_Click(object sender, EventArgs e)
            {
                System.Drawing.Graphics desen;
                desen = this.CreateGraphics();
                System.Drawing.Pen creion_albastru;
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                desen.DrawLine(creion_albastru, 150, 50, 350, 200);
                desen.DrawRectangle(creion_albastru, 250, 50, 200, 100);
                desen.DrawEllipse(creion_albastru, 250, 150, 105, 105);
                desen.DrawEllipse(creion_albastru, 150, 50, 95, 200);
            }
    



         - Definirea obiectului "desen": System.Drawing.Graphics desen; adica am definit obiectul desen de tipul System.Drawing.Graphics
         - Crearea obiectului: desen = this.CreateGraphics();
         - Definirea obiectului "creion_albastru": System.Drawing.Pen creion_albastru; adica am definit obiectul Creion_albastru de tipul System.Drawing.Pen
         - Crearea obiectului "creion_albastru": creion_albastru =new System.Drawing.Pen(System.Drawing.Color.Blue);
         - Desenarea unei linii: desen.DrawLine(creion_albastru,150,50,350,200); adica traseaza o linie cu creionul albastru pe obiectul "desen". Linia incepe din pozitia X1,Y1 pana in pozitia X2,Y2 exprimate in pixele. In cazul de fata X1=150;Y1=50;X2=350;Y2=200). Coltul stanga sus al form-ului are coordonatele 0,0 iar coltul dreapta jos are coordonatele xmax=this.Width, ymax=this.Height
         - Desenarea unui dreptunghi: desen.DrawRectangle(creion_albastru,250,50,200,100); adica se deseneaza un dreptungi cu creionul albastru pe obiectul "Dsen". Linia incepe din pozitia X1,Y1 pana in pozitia X2,Y2 exprimate in pixele. In cazul de fata X1=250;Y1=50;X2=200;Y2=100).
         - Desenarea unui cerc: desen.DrawEllipse(creion_albastru,250,150,105,105); adica se deseneaza o elipsa cu creionul albastru pe obiectul "Dsen". Linia incepe din pozitia X1,Y1 de inaltime si latime egale exprimate in pixele. In cazul de fata X1=250;Y1=150;H=105;L=105). Desigur in acest car va rezulta un cerc.
         - Desenarea unei elipse: desen.DrawEllipse(creion_albastru,150,50,95,200);; adica se deseneaza o elipsa cu creionul albastru pe obiectul "Dsen". Linia incepe din pozitia X1,Y1 de inaltime si latime egale exprimate in pixele. In cazul de fata X1=150;Y1=50;H=95;L=200). Desigur in acest car va rezulta o elipsa.

        Desenarea formelor geometrice pline.

        Realizam o noua aplicatie unde vom desena forme geometrice pline.
        Deschidem un nou proiect Windows Forms Application intitulat fill_f_geom si plasam un buton cu proprietatea Text="Deseneaza", dupa care creem evenimentul "Click".


        Completam procedura creata pe evenimentul click a obiectului "button1" cu

       C#

            private void button1_Click(object sender, EventArgs e)
            {
                System.Drawing.Graphics desen;
                desen = this.CreateGraphics();
                System.Drawing.SolidBrush pensula;
                pensula = new System.Drawing.SolidBrush(System.Drawing.Color.Aquamarine);
                desen.FillRectangle(pensula, 150, 25, 75, 130);
                desen.FillEllipse(pensula, 250, 5, 75, 130);
                desen.FillRectangle(pensula, 200, 175, 190, 40);
            }

         - Pentru desenarea formelor pline se defineste o pensula: System.Drawing.SolidBrush pensula;
         - Se creaza obiectul Pensula apoi cu: pensula=new System.Drawing.SolidBrush(System.Drawing.Color.Aquamarine);
         - Dreptunghi plin se deseneaza cu metoda: desen.FillRectangle(pensula, 150, 25, 75, 130);
         - Elipsa plina se deseneaza cu metoda: desen.FillEllipse(pensula, 250, 5, 75, 130);

        Vom colora acum un sector de cerc folosind metoda FillPie in urmatorul proiect Windows Forms Application intitulat fill_00 si plasam un buton cu proprietatea Text="Deseneaza", dupa care creem evenimentul "Click".


        Completam procedura creata pe evenimentul "Click" a obiectului "button1" cu:

       C#
    	private void button1_Click(object sender, EventArgs e)
            {
                System.Drawing.Graphics desen;
                desen = this.CreateGraphics();
                System.Drawing.Pen creion_albastru;
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                System.Drawing.SolidBrush pensula;
                pensula = new System.Drawing.SolidBrush(System.Drawing.Color.Aquamarine);
                desen.FillPie(pensula, 150, 10, 200, 200, 0, 45);
                desen.DrawEllipse(creion_albastru, 150, 10, 200, 200);
            }
    
    


        In toate aplicatiile realizate pana acum, am plasat un obiect de tip "button", dupa care am utilizat evenimentul "Click". Vom utiliza aacum in aplicatia fill_01 un obiect "trackBar" si vom folosi evenimentul "Scroll" pentru colora acum un sector de cerc de dimensiune data de obiectul "trackBar".


        Completam procedura creata pe evenimentul "Scroll" a obiectului "trackBar1" cu:

       C#
            private void trackBar1_Scroll(object sender, EventArgs e)
            {
                System.Drawing.Graphics desen;
                desen = this.CreateGraphics();
                System.Drawing.Pen creion_albastru;
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                System.Drawing.SolidBrush pensula;
                pensula = new System.Drawing.SolidBrush(System.Drawing.Color.Aquamarine);
                desen.Clear(this.BackColor);
                desen.FillPie(pensula, 50, 10, 200, 200, 0, this.trackBar1.Value);
                desen.DrawEllipse(creion_albastru, 50, 10, 200, 200);
            }
    


        Dupa cum se observa, pentru a realiza aplicatia dinamica, a trebuit sa stergem desenul la fiecare eveniment "Scroll" cu metoda : desen.Clear(this.BackColor);

        Autoscalarea formelor geometrice.

        Ne propunem in continuare sa desenam forme geometrice care se redimensioneaza odata cu redimensionarea form-ului.
        Am utilizat in exemplele anterioare diverse metode de desenare in care am furnizat valori absolute pentru a transmite coordonatele figurilor geometrice. Am utilizat de exemplu pentru desenarea unui cerc:
    desen.DrawEllipse(creion_albastru, 50, 10, 200, 200);

        Coordonatele fiind: 50, 10, 200, 200. Acesta este un caz particular. Am putea transmite coordonatele si prin intermediul variabilelor. Variabilele si tipul acestora vor fi tratate in cursurile viitoare, totusi vom defini acum variabile cu numere intregi pentru a putea fi utilizate in cadrul trasarii figurilor grafice elementare.
        Pentru a defini o variabila de tip intreg va trebui sa precizam tipul ei adica int si numele atribuit. Astfel vom defini variabilele x0,y0,w1,w2 astfel:

            int x0=50;
            int y0=10;
            int w1=200;
            int w2=200;
    


       Aplicati C# care deseneaza un cerc pe evenimentul "Paint" va fi:

            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                int x0=50;
                int y0=10;
                int w1=200;
                int w2=200;
                System.Drawing.Graphics desen;
                desen = this.CreateGraphics();
                System.Drawing.Pen creion_albastru;
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                desen.DrawEllipse(creion_albastru, x0, y0, w1, w2);
            }
    


       Vom desena in aplicatia dr_centr_00 , folosind variabilele int wd si int ht un dreptungi centrat care isi modifica dimensiunea proportional cu dimensiunea form-ului.



        Vom folosi evenimentul "Paint" care se activeaza la startarea programului dar si la redimensionarea formului.

        	private void Form1_Paint(object sender, PaintEventArgs e)
            {
                System.Drawing.Graphics desen;
                desen = this.CreateGraphics();
                System.Drawing.Pen creion_albastru;
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                desen.Clear(this.BackColor);
                // latimea desenului
                int wd = this.Width ;
                // inaltimea desenului
                int ht = this.Height ;
                // desenare axe
                desen.DrawLine(creion_albastru, wd / 2, 0, wd / 2, ht);
                desen.DrawLine(creion_albastru, 0, ht / 2, wd, ht / 2);
                int wd_d = wd / 3;  // latimea dreptunghiului
                int ht_d = ht / 3;    // inaltimea dreptunghiului
                // coltul stanga sus
                int x0 = (wd - wd_d) / 2;
                int y0 = (ht - ht_d) / 2;
                // desenare dreptunghi
                desen.DrawRectangle(creion_albastru, x0, y0, wd_d, ht_d);
            }
    


        Dupa cum se observa dreptunghiul nu este perfect centrat deoarece nu am tinut cont de dimensiunea "Title bar" si latimea "Border-ului". Aceste elemente vor fi corectate in aplicatia dr_centr


        Continutul procedurii "Form1_Paint" fiind:

            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                System.Drawing.Graphics desen;
                desen = this.CreateGraphics();
                System.Drawing.Pen creion_albastru;
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                desen.Clear(this.BackColor);
                this.label1.Text = "Title bar:"+SystemInformation.CaptionHeight.ToString();
                this.label2.Text = "Border:" + SystemInformation.BorderSize.Width.ToString();
                // latimea desenului
                int wd = this.Width - 2*SystemInformation.BorderSize.Width;
                // inaltimea desenului
                int ht = this.Height - SystemInformation.CaptionHeight - SystemInformation.BorderSize.Width;
                // desenare axe
                desen.DrawLine(creion_albastru, wd / 2, 0, wd / 2, ht);
                desen.DrawLine(creion_albastru, 0,ht / 2, wd, ht/2);
                int wd_d = wd / 3;  // latimea dreptunghiului
                int ht_d = ht/3;    // inaltimea dreptunghiului
                // coltul stanga sus
                int x0 = (wd-wd_d)/2;   
                int y0 = (ht-ht_d)/2;
                // desenare dreptunghi
                desen.DrawRectangle(creion_albastru, x0, y0, wd_d, ht_d);
            }
        }   
    


        Daca se redimensioneaza form-ul, imaginea se autoscaleaza:



    Afisare imagini in C# WFA


         Pentru afisarea unei imagini, trebuie sa pregatim in prealabil fisierul imagine de tip bmp al imaginii de afisat. Sa presupunem ca vrem sa afisam imaginea: umfst.bmp.
         In urmatoarea aplicatie, imag_00 se va afisa imaginea umfst.bmp utilizand un obiect de tip imagine pe care il vom denumi "img".
         Definirea obiectului "img" de tip imagine se face cu : System.Drawing.Bitmap img;
         Crearea obiectului "img" se face prin instantierea clase Bitmap astfel : img = new Bitmap(nume_fisier bmp); .
         Avem nevoie de asemenea de obiectul "desen", definit prin: System.Drawing.Graphics desen;
         Crearea obiectul "desen": desen = this.CreateGraphics();
         Pentru afisarea imaginii vom invoca metoda DrawImage astfel: desen.DrawImage(img, x0, y0) unde x0, y0 sunt coordonatele stanga sus de unde incepe afisarea imaginii.

            private void Form1_Paint(object sender, PaintEventArgs e)
            {       
                System.Drawing.Bitmap img;
                System.Drawing.Graphics desen;
                img = new Bitmap("umfst.bmp");
                desen = this.CreateGraphics();
                desen.DrawImage(img, 0, 0);
            }
    




       Cu metoda prezentata anterior, putem afisa numai imagini descrise de fisiere de tip "bmp".
       Folosind obiectul "PictureBox", afisa in aplicatia imag_000 imaginea lab.jpg . Pentru afisarea imagini, trebuie sa pregatim in prealabil fisierul lab.jpg
    • Plasam un obiect PictureBox cu numele pictureBox1
    • Selectam fisierul "lab.jpg" la proprietatea Image a obiectului pictureBox1
    • Setam proprietatea SizeMode a obiectului pictureBox1 la "AutoSize"