. Programare Windows In Visual C++ cu Mfc

Structura lucrării

Lucrarea prezintă o secțiune a programării cu MFC, și anume, crearea unei aplicații dialog based cu ajutorul mediului de dezvoltare Visual C++, și este structurată în trei părți, pe care le voi prezenta în continuare :

Partea I : Noțiuni fundamentale despre MFC

Pentru început am realizat o scurtă prezentare a Microsoft Fundation Classes (MFC), una din bibliotecile de clase cel mai des utilizate de către programatori. Aceasta însoțește multe din compilatoarele C++ pentru Windows, printre care și Visual C++.

Această secțiune prezintă mai întâi apariția și evoluția MFC. În 1991, Microsoft formează o echipă numită AFX, însărcinată cu crearea unei biblioteci de clase C++ care să fie livrată împreună cu compilatoarele Microsoft. Unul dintre scopurile acestei biblioteci este crearea unui mediu de lucru care să permită realizarea mai ușoară a aplicațiilor Windows folosind reutilizarea componentelor.

În martie 1992, apare MFC 1.0 pentru Windows 3.1 împreună cu Microsoft C/C++ 7.0. În septembrie 1995 Microsoft a lansat MFC 4.0. Avantajul major al MFC 4.0 este faptul că permite exploatarea eficientă a sistemului de operare Windows 95. Înainte de MFC 4.0, toolbar-ul, statusbar-ul și altele erau implementate intern prin MFC. Microsoft dorește ca toate aplicațiile să fie capabile să folosească aceste componente, astfel că ele vor fi implementate în sistemul de operare sub formă de controale. Această versiune MFC este cea care a realizat revoluția MFC, trecerea de la structura vechilor versiuni la noua structură. Bineânțeles, aceasta a suportat și suportă în continuare numeroase îmbunătățiri și adăugiri.

Clasele MFC ne ajută nu doar să economisim timp, ci și fac procesul de dezvoltare mai ușor decât în cazul folosirii interfeței “brute” Windows API.

Partea II -a : Prezentare Visual C++

Această parte a lucrării oferă o imagine de ansamblu a mediului de dezvoltare Visual C++, care este cel mai dinamic mediu de programare profesional aflat la dispoziția programatorilor pentru Windows. Cu ajutorul lui Visual C++ puteți crea nu numai aplicații convenționale pentru Windows, ci și programe server și client ActiveX, programe pentru baze de date, controale ActiveX, obiecte programabile și multe altele.

În continuare, această parte include prezentarea numeroaselor instrumente de programare ale mediului Visual C++, printre care AppWizard, ClassWizard, compilatorul și depanatorul, precum și editoarele de resurse.

Partea III-a : Realizarea și prezentarea aplicației “Agenda”

Această parte a lucrării prezintă aplicația care se intitulează “Agenda”, și ilustrează programarea cu ajutorul noilor medii de dezvoltare vizuale, mai exact cu Visual C++. Structura aplicației este de tip dialog (dialog based).

După prezentarea elementelor de bază, care constituie crearea structurii aplicației, această parte continuă prezentarea modelării interfeței aplicației, iar apoi a modului de construire a aplicației, prin adăugarea de controale, tratarea mesajelor și adăugarea de membrii.

În ultima secțiune a acestei părți am prezentat utilizarea aplicației; după cum sugerează și titlul acesteia, ea realizează evidența programului dumneavoastră zilnic, vă avertizează asupra ceea ce este mai important în programul dumneavoastră, zile onomastice, întâlniri sau diferite alte evenimente pe care le doriți.

Partea I

Noțiuni fundamentale despre MFC

I.1. Evoluția MFC

Una din bibliotecile de clase cel mai des utilizate de către programatori este Microsoft Fundation Classes (MFC). Aceasta însoțește multe din compilatoarele C++ pentru Windows, printre care Visual C++, Symantec C++, Watcom C++. De asemenea, există variante pentru sistemul de operare System 7.5 de pe Macintosh și pentru diferite versiuni de Unix. Istoria acestei biblioteci este prezentată pe scurt în cele ce urmează.

I.1.1. Crearea MFC

În 1991, Microsoft formează o echipă numită AFX (Application FrameworX), însărcinată cu crearea unei biblioteci de clase (de tip framework) C++ care să fie livrată împreună cu compilatoarele Microsoft. Unul dintre scopurile acestei biblioteci este crearea unui mediu de lucru care să permită realizarea mai ușoară a aplicațiilor Windows folosind reutilizarea componentelor. Grupul inițial AFX a proiectat o bibliotecă de clase care făcea trecerea de la Windows API la o arhitectură preluată de la Macintosh (toolbox) și a încercat să scrie aplicații cu prototipul construit. Au ajuns la concluzia că nu se poate trece peste cunoștințele de programare Windows. Astfel, apărea necesitatea ca programatorii care foloseau această bibliotecă să fie familiarizați cu Windows API.

MFC 1.0 : Nașterea MFC

În martie 1992, apare MFC 1.0 pentru Windows 3.1 împreună cu Microsoft C/C++ 7.0. Această bibliotecă reprezintă o abstractizare pentru Windows API, încapsulând obiectele Windows mai des utilizate în clase C++. MFC 1.0 introduce CObject ca și clasă de bază pentru MFC (asemănătoare lui Object din Smalltalk). CObject oferă posibilitatea determinării tipului (CRuntimeClass), serializării (CArchive) și depanării. De asemenea, există și o serie de clase de interes general.

Dintre acestea amintim :

clase pentru colecții, liste, tablouri;

o clasă pentru manipularea șirurilor de caractere (CString);

clase pentru gestiunea timpului (CTime, CTimeSpan, CDate);

clase pentru acces la fișiere.

O aplicație construită folosind MFC 1.0 permite în principiu lucrul

cu mai multe ferestre (MDI) precum și suport pentru OLE 1.0. MFC 1.0 nu a avut însă un succes deosebit datorită faptului că nu era prea ușor de folosit.

MFC 2.x : Adolescența

În februarie 1993, apare MFC 2.0, tot pe 16 biți, împreună cu Visual C++ 1.0. Se introduce o familie de clase care permit realizarea aplicațiilor cu o arhitectură vedere-document (document-view), preluată după arhitectura MVC (Model – View – Controler) din Smalltalk. Această bibliotecă conține, printre altele, clase pentru cutii de dialog cu o largă utilizare (common dialogs), statusbar (linie de stare) și toolbar. Această versiune a MFC a devenit mult mai populară decât versiunea 1.0, deoarece aici se simplifică cu adevărat multe dintre aspectele programării Windows (exemple: tipărirea la imprimantă, vizualizarea documentelor pregătite pentru a fi tipărite – "print preview", utilizarea liniei de stare și a barei de unelte – toolbar). Înaintea apariției MFC 2.0, folosind Windows API, realizarea acestor funcționalități necesita cel puțin câteva săptămâni de muncă susținută.

Dar să vedem ce alte caracteristici au fost introduse în MFC 2.0 :

implementare completă a opțiunilor de meniu File Open, Save, Save As și păstrarea automată a listei cu fișierele cel mai recent folosite;

ferestre cu posibilități de defilare (scroll);

acces la controale VBX;

help sensitiv dependent de context;

procesarea automată a datelor introduse într-o cutie de dialog;

o interfață îmbogățită ce permite facilități OLE (Object Linking and Embedding) versiunea 1.0;

suport pentru DLL (Dynamic Link Library);

Ce a urmat? Microsoft rescrie rapid biblioteca MFC pentru Windows NT lansând-o în august 1993. O critică adusă acestei versiuni pe 32 de biți este faptul că nu oferă posibilități multi-thread (adică nu oferă facilități pentru realizarea aplicațiilor cu mai multe fire de execuție în paralel). În decembrie 1993, Microsoft lansează MFC 2.5 versiunea care integrează noile tehnologii OLE (2.0) și ODBC (Open DataBase Connectivity). Din cauză că nu există suport OLE în Windows NT 3.1, nu se distribuie o versiune pe 32 biți care să integreze aceste tehnologii (abia Windows NT 3.5 va oferi prima implementare pe 32 de biți a lui OLE).

MFC 3.x : Maturitatea

În versiunea 3.0, lansată în septembrie 1994, MFC face trecerea de la lumea pe 16 biți la cea pe 32 de biți. MFC 3.0 include versiunile pe 32 de biți ale claselor introduse în MFC 2.5, folosite pentru implementarea tehnologiilor OLE și ODBC.

În completarea primelor versiuni MFC, versiunea 3.0 mai aduce și alte îmbunătățiri. Acestea ar fi :

înlăturarea restricțiilor de memorie pentru colecții – la versiunile anterioare de MFC sub Windows 3.1, dimensiunea vectorilor (CObArray, CStringArray, și altele) era limitată la 64KB pentru modele de memorie small și medium, iar numărul de elemente al vectorilor era limitat la 32.768; acum pentru Windows NT, dimensiunea vectorilor este condiționată numai de memoria disponibilă;

dialoguri multi-panou ("tabbed dialogs"; un exemplu de astfel de dialog este cutia de dialog care se deschide la selectarea opțiunii de meniu Tools/Options din Microsoft Word 6.0);

clase colecție bazate pe template (generice);

facilități pentru realizarea aplicațiilor multi-thread;

toolbar-uri cu formă și poziție variabilă;

extinderea clasei CTime pentru a permite gestiunea timpului sistemului și a atributelor temporale ale fișierelor.

MFC 3.1 a apărut în ianuarie 1995. Ca noutate el introduce facilități pentru lucrul cu Mail API (MAPI), un set de clase WinSock (socket asemănător BSD) și o versiune beta a claselor pentru controalele din Windows 95 ("common controls").

MFC 3.2 apare în iulie 1995; el îmbunătățește clasele pentru controalele din Windows 95 și corectează anumite erori existente în versiunea beta (MFC 3.1).

MFC 4.x, 5.0, 6 : Următoarea generație

Microsoft a lansat MFC 4.0 (septembrie 1995). Avantajul major al MFC 4.0 este faptul că permite exploatarea eficientă a sistemului de operare Windows 95. Înainte de MFC 4.0, toolbar-ul, statusbar-ul și altele erau implementate intern prin MFC. Microsoft dorește ca toate aplicațiile (inclusiv cele care nu folosesc MFC) să fie capabile să folosească aceste componente, astfel că ele vor fi implementate în sistemul de operare sub formă de controale. Atât Windows 95 cât și Windows NT 3.51 includ acest nou set de controale numite "Windows common controls". Ca urmare, în MFC 4.0 au fost introduse clase care abstractizează această bibliotecă de controale a sistemului de operare. În cazul în care în MFC 4.0 există clase implementate anterior, cum ar fi CToolBar (în MFC 3.x), acestea sunt redenumite – de exemplu COldToolBar – iar CToolBar este noua clasă care folosește biblioteca de controale (common controls). Astfel, integrarea de noi controale în interiorul aplicațiilor va cere un efort minim.

Iată și câteva clase din MFC 4.0 care folosesc controale din biblioteca sistemului de operare :

CAnimateCtrl furnizează funcționalități de bază pentru animație;

CCheckListBox o listă ce conține elemente ce pot fi selectate;

CDragListBox o listă în care ordinul unui element poate fi schimbat folosind mouse-ul;

CHeaderCtrl folosită pentru setarea caracteristicilor unei pagini;

CHotKeyCtrl oferă utilizatorului posibilitate apăsării unei secvențe de taste pentru a realiza o acțiune;

CImageList înmagazinează o listă de imagini pentru afișarea într-o listă sau într-o animație;

CListCtrl o listă de imagini;

CRichEditCtrl un control pentru text care suportă diferite stiluri și formate;

CSpinControlCtrl săgeți pentru incrementarea și decrementarea unei valori;

CStatusBarCtrl înlocuiește CStatusBar;

CTabCtrl pentr dialoguri cu mai multe panouri, înlocuind CPropertySheet;

CTreeCtrl realizează un arbore expandabil;

CToolBarCtrl toolbar, înlocuind CToolBar;

CToolTipCtrl dă utilizatorului informații rapide despre interfața utilizator.

Pentru Windows 95 :

CFileDialog pentru deschiderea și salvarea fișierelor;

CPageSetup pentru setarea paginii pentru tipărire;

COleObjectProperties pentru schimbarea proprietăților obiectelor OLE.

Aplicațiile pentru Windows 95 care folosesc MFC 4.0 sunt mai

bine integrate în sistemul de operare, permițând automat :

“drag-and-drop printing” : mutarea icon-ului unui document peste icon-ul imprimantei are ca efect lansarea automată a aplicației în background pentru tipărirea documentului la imprimantă;

meniuri contextuale : la apăsarea butonului drept al mouse-ului peste diferite obiecte ale aplicației va fi afișaterite obiecte ale aplicației va fi afișat un meniu care descrie comportamentul obiectelor afișate;

TCARD : instrument prin care utilizatorul poate primi sugestii privind aplicația. MFC 4.0 oferă posibilitatea atașării TCARD la diferite componente ale aplicației. Totodată există noi clase Win32 pentru programarea multi-thread ca : CSyncObject, CSemaphore, CCriticalSection, CMutex, CEvent, CSingleLock, CMultiLock. Altă caracteristică importantă a MFC 4.0 este suportul pentru controale OLE. Numele original al acestora este OCX, și sunt succesorii pe 32 biți al controalelor VisualBasic, VBX. Suportul pentru controale OLE este integrat în clasa CWnd, astfel că se pot crea controale OLE în dialoguri, view-uri, și alte clase derivate din CWnd.

Microsoft a lansat la începutul anului 1996 o extensie a bibliotecii MFC 4.0 (4.1) care are în plus unele caracteristici Windows 95 și îmbunătățește suportul pentru controalele OLE.

În anul 1997 Microsoft a lansat MFC 5.0 care este o îmbunătățire a versiunilor anterioare.

Apoi a apărut versiunea MFC 6, care aduce noi îmbunătățiri.

MFC : Viitorul

Ce ne poate oferi viitorul, cu așa un trecut, doar cei de la Microsoft pot să pronosticheze.

I.1.2. Istoria versiunilor MFC

Framework este o colecție integrată de compomente software orientate obiect care oferă tot ce este nevoie pentru realizarea unei aplicații generice;

Arhitectura MVC este o arhitectură apărută în mediul academic în 1980, odată cu Smalltalk, și preluată de Apple Computer în 1985 pentru MacApp;

Arhitectura vedere-document este o arhitectură pe care se bazează în general aplicațiile construite folosind MFC, ea având ca scop separarea datelor de interfața utilizator;

COM – Common Object Model: protocol de comunicație Windows orientat obiect, care furnizează :

o standardizare a modului în care un EXE poate controla un alt

EXE (înlocuind DDE);

un mod standard prin care un client EXE poate apela un DLL ca și server;

înlocuiește controalele VBX cu OCX; OLE – Object Linking and Embedding: un superset al COM, care permite, printre altele, editare vizuală și drag-and-drop. ODBC – Microsoft Open DataBase Conectivity: standard care constă dintr-o mulțime extensibilă de DLL-uri care furnizează o interfață standard pentru programatorii care doresc să folosească anumite tipuri de formate pentru baze de date. ODBC este bazat pe o versiune standardizată a SQL (Structured Query Language); VBX – Visual Basic Control : tip special de DLL, pe 16 biți; OCX – control OLE, pe 32 biți; DLL – Dynamic Link Library : module care pot fi încărcate și legate în timpul execuției.

Versiune Data apariției 16/32 biți

1.0 3 / 1992 16 biți

1.0 NT 7 / 1992 32 biți

2.0 2 / 1993 16 biți

2.1 8 / 1993 32 biți

2.5 12 / 1993 16 biți

2.51 9 / 1994 16 biți

2.52 1 / 1995 16 biți

2.53 7 / 1995 16 biți

3.0 9 / 1994 32 biți

3.1 1 / 1995 32 biți

3.2 7 / 1995 32 biți

4.0 9 / 1995 32 biți

4.21 1 / 1997 32 biți

5.0 / 1998 32 biți

6.0 / 2000 32 biți

7.0 2 / 2002 32 biți

I.2. Biblioteca Microsoft Foundation Class

I.2.1. Prezentarea claselor MFC

Clasele MFC ne pun la dispoziție o abordare orientată pe obiect a mediului Windows, ajutându-ne nu doar să economisim timp, ci și făcând procesul de dezvoltare mai ușor decât în cazul folosirii interfeței “brute” Windows API.

I.2.1.1. O privire generală asupra claselor MFC

Biblioteca MFC face parte dintr-o categorie de programe numite cadre de aplicație (application frameworks).

Să ne gândim la procesul care trebuie parcurs la scrierea unei aplicații Windows în C folosind sistemul Windows SDK. Trebuie creat un model de cod sursă care conține funcția WinMain() (punctul de pornire al tuturor aplicațiilor Windows). Trebuie apoi scris codul de inițializare al aplicației urmat de un ciclu de mesaje (care pare să nu se modifice prea mult, indiferent de programul pe care îl scrieți). Apoi trebuie înregistrate clasele de ferestre (cu funcția RegisterClass()) și trebuie scrisă o procedură de apelare a ferestrei (cunoscută sub numele de WndProc) pentru fiecare clasă pe care o creem. Dacă programul folosește casete de dialog, acestea trebuie create cu ajutorul unui editor oarecare de resurse sau se poate edita manual fișierul cu extensia .rc. Apoi trebuie scrisă o procedură de dialog (sau DlgProc) pentru fiecare casetă de dialog. Apoi trebuie atașată caseta de dialog la codul sursă, astfel încât ea să fie afișată la momentul potrivit. În procedurile de fereastră creem o instrucțiune “switch” imensă, cu o instrucțiune “case” pentru fiecare mesaj venit de la sistemul Windows, pe care vrem să îl trateze programul. Pentru fiecare instrucțiune case, trebuie să tratăm parametrii pe care îi transmite sistemul Windows (prin variabilele LPARAM și WPARAM), asigurându-ne că am returnat valoarea corespunzătoare (sau că am apelat funcția DefWndProc, dacă este nevoie). În fișierele antet furnizate de compilatorul C++ se găsește și fișierul windowsx.h (care conține codurile mesajelor Microsoft) din care se pot obține valorile variabilelor pe care le transmite sistemul Windows.

După ce trebuie parcurs acest proces de câteva ori, majoritatea programatorilor trec în modul “decupare”, modificând programele vechi corespunzător necesităților actuale. Ghidul programatorului în Windows SDK și alte cărți de Windows, prezintă această metodă de dezvoltare a programelor Windows, metodă în care trebuie examinat fiecare program, astfel încât să descoperim diferențele dintre acestea.

După ce am folosit pentru o vreme această metodă de programare, am observat că pierd tot mai mult timp cu scrierea elementelor de bază ale programului, care, de cele mai multe ori, sunt asemănătoare. În acest moment, creem un program care nu face nimic, dar pe care îl putem folosi pentru a începe orice proiect. De asemenea, după studierea codului scris, se pot observa câteva reguli simple pe care trebuie să le ținem minte – cum ar fi “folosim CreateBitmap() pentru a crea o imagine bitmap, dar folosim DeleteObject() ca să scăpăm de aceasta”, sau “trebuie să ne asigurăm că am folosit BeginPaint() și EndPaint() în WM_PAINT pentru a nu crea confuzie în Windows”.

Dacă aceste lucruri ne par familiare, atunci sigur ne-am întrebat dacă nu există o metodă mai bună. De ce să ținem minte toate aceste detalii ? Acesta este motivul pentru care au fost create cadre de lucru. În loc să pierdem timpul cu scrierea aceluiași cod pentru fiecare aplicație pe care o începem, folosim un cadru de lucru, care ne pune la dispoziție elementele de bază de care avem nevoie în fiecare aplicație pe care o scriem.

De fapt, cadrele de lucru îndeplinesc două funcții : definesc comportarea unei aplicații de bază și (sub Windows) furnizează o interfață, bazată pe clase, către interfața API (Windows API). Deoarece cadrul de lucru definește o aplicație de bază, putem scrie programe simple cu un cod sursă foarte mic. Cadrul de lucru oferă un comportament prestabilit, pe care programul îl moștenește. Dacă vrem ca programul să facă ceva diferit, putem să suprascriem (sau să extindem) funcțiile furnizate de cadrul de lucru.

I.2.1.2. Cum arată MFC

MFC este furnizat sub forma claselor C++. Aceste clase înglobează toate detaliile lucrului cu interfața Windows API, inclusiv cele legate de subiecte complicate, precum OLE (legarea și înglobarea obiectelor – Object Linking and Embedding), ODBC (conectivitatea bazelor de date deschise – Open DataBase Connectivity) și Winsock (implementarea sub Windows a protocolului TCP-IP, baza aplicațiilor care recunosc rețeaua Internet). Clasele ne pun la dispoziție elementele de bază ale unei aplicații și oferă acesteia un grad mai înalt de funcționalitate.

MFC pune la dispoziția aplicațiilor câteva facilități importante. Cadrul de lucru permite crearea aplicațiilor care folosesc o singură fereastră (cunoscute și sub numele de aplicații SDI, sau aplicații cu interfață mono-document), sau ferestre multiple în cadrul aceleiași ferestre de aplicație (cunoscute și dub numele de aplicații MDI, sau aplicații cu interfață multi-document). Aplicațiile MDI acceptă adăugarea listelor cu ultimele fișiere folosite (“Last Used Files”), astfel că MFC urmărește ultimele fișiere deschise de aplicație. De asemenea, MFC permite schimbarea meniurilor atunci când alte ferestre devin active.

Cadrul de lucru permite folosirea barelor cu instrumente (mobile sau fixe). Deși MFC furnizează automat câteva imagini pentru butoanele barelor cu instrumente, trebuie să vă creați propriile imagini pentru barele cu instrumente personalizate. După crearea imaginilor, furnizăm claselor MFC o procedură de manipulare a barei cu instrumente, iar cadrul de lucru se va ocupa în continuare de afișarea barei cu instrumente, de click-urile de mouse executate pe butoane și va furniza automat asistență pentru fiecare buton. Dacă bara cu instrumente este ancorabilă, clasele MFC vor realiza automat ancorarea acesteia.

MFC înglobează toate elementele Windows de interfață cu utilizatorul și de interfață grafică cu dispozitivele (GDI). Putem să creem obiecte precum creioane, fonturi, pensule și așa mai departe, existând clase care distrug automat obiectele GDI create, atunci când acestea nu mai sunt în domeniu. În mod asemănător, MFC pune la dispoziție pentru butoane (inclusiv butoane care conțin imagini personalizate), casete de liste, casete combinate, butoane radio și rubrici pentru introducerea textului. De asemenea, cadrul de lucru permite folosirea casetelor de dialog obișnuite, acestea fiind casete de dialog standard furnizate de Microsoft pentru deschiderea fișierelor, selectarea fonturilor, selectarea culorilor și stabilirea opțiunilor pentru imprimantă.

Cadrul de lucru oferă și asistență soft on line, folosind fișierele Help din Windows. Așa cum veți vedea mai târziu, programul AppWizard este de mare ajutor, oferindu-ne fișiere Help “standard” pe care le putem folosi ca punct de plecare.

MFC acceptă și unele operații care nu sunt legate direct de Windows, dar care vă ajută la crearea unor aplicații robuste. Cadrul de lucru furnizează clase care permit crearea unor structuri de date abstracte, cum ar fi listele cu legături, extensiile și matricile. Aceste clase abstracte ”știu” să citească și să scrie din și în fișiere, simplificând operațiile de salvare și de refacere a datelor. De asemenea, MFC pune la dispoziție clase pentru șiruri de caractere de lungimi variabile.

Dacă lucrăm cu elemente complexe de interfață API, cum ar fi OLE, cadrul de lucru ne pune la dispoziție clase care simplifică folosirea interfeței API. Pe scurt, aceste clase conțin mai mult de 20.000 de linii de cod sursă pentru OLE, pe care le putem folosi ca bază, eliberându-vă de sarcina de a învăța tot felul de detalii despre OLE. În mod asemănător, clasele ODBC ne oferă o imagine abstractă, tabelară, a bazelor de date pe care le folosim.

La fel ca majoritatea cadrelor de lucru pentru aplicații, MFC oferă aplicațiilor un grad înalt de portabilitate. MFC acceptă nu numai sistemele de operare Windows actuale, ci și pe cele mai vechi, și chiar System 7 pentru calculatoarele Macintosh. Programele nu trebuie să țină seama de diferențele dintre aceste platforme; de aceste detalii se ocupă clasele MFC. Nu trebuie decât să recompilăm aplicația.

Cu toate acestea, facilitățile de mai sus nu se aplică de la sine. Trebuie să mai facem și noi câte ceva. Așa cum vom vedea în curând, MFC ne ajută să dezvoltăm o aplicație completă. Putem folosi programul AppWizard pentru a genera codul, dar, deși programul generat rulează, el nu face nimic special. Trebuie să determinăm programul să facă ceea ce dorim. Totuși, în loc să scriem o mulțime de linii de cod pentru a ajunge în acest punct, nu trebuie decât să adăugăm clase și metode care să intre în acțiune atunci când MFC predă controlul aplicației.

Un aspect al multor cadre de lucru (printre care și MFC), care dă programatorilor ceva bătaie de cap, este folosirea arhitecturii document/view (document/vizualizare). Aceasta este o modalitate de a descrie modul în care MFC folosește codul pentru a prezenta datele și a interacționa cu utilizatorul. MFC nu aduce nimic nou aici; și alte cadre de lucru folosesc arhitectura document/view. Cadrele de lucru care nu folosesc această arhitectură tratează ferestrele ca spații care urmează să fie pictate, așa cum face interfața Windows API.

Într-o arhitectură document/view, cadrul de lucru folosește documentul, nu fereastra. Documentele nu sunt altceva decât clase folosite pentru reprezentarea datelor. Aceste clase știu să citească și să scrie în și din fișiere propriul conținut, să se actualizeze și să afișeze pe ecran. Vizualizările sunt clase care afișează conținutul documentelor.

I.2.2. Cele mai importante clase MFC

Această secțiune vă prezintă câteva dintre cele mai importante clase furnizate de MFC.

Prima clasă cu care trebuie să faceți cunoștință este CObject, cunoscută și ca “mama tuturor claselor”. Multe din clasele MFC moștenesc comportamentul și posibilitățile acestei clase. Printre altele, clasa CObject dă claselor posibilitatea de serializare proprie prin intermediul clasei CArhive, care permite claselor să-și citească și să-și scrie propriul cod din și în fișiere, cu adăugarea unor secvențe minime de cod din partea programatorului. De asemenea, CObject permite determinare tipului unei clase în timpul rulării, cu ajutorul metodelr GetRuntimeClass() și IsKindOf(). În plus, CObject permite programelor să-și verifice starea internă în timpul rulării, cu ajutorul metodei IsValid(), ori de câte ori dorește cel care dezvoltă programul. Putem să scriem pentru o clasă o versiune a funcției IsValid() și să o apelăm în timpul rulării, astfel încât programul să verifice dacă instanța unei clase este “validă”. În sfârșit, CObject permite afișarea brută a obiectelor, prin intermediul metodei Dump(), astfel încât clasele își pot afișa propriul conținut într-o modalitate inteligibilă în timpul rulării programului. Deși CObject este clasa de bază pentru multe clase MFC, nu toate clasele moștenesc clasa CObject. Totuși, dacă una din clasele create de programator moștenește clasa CObject, suprasarcina acesteia este foarte mică.

Atunci când creem o aplicație cu ajutorul claselor MFC, creem o clasă derivată din CWinApp. Clasa CWinApp definește obiectul aplicației. În mod normal dacă scriem o aplicație C în Windows SDK, furnizăm o funcție WinMain() care va fi apelată de Windows. Cu alte cuvinte, din punctul nostru de vedere, WinMain() este punctul de pornire al aplicației. În MFC creem o clasă derivată din CWinApp și introducem în acesată clasă metodele care formează aplicația. Nu mai este nevoie să creem nici o funcție WinMain(), existând deja o funcție WinMain() în cadrul clasei MFC. Atunci când aplicația este lansată în execuție, este construită automat clasa derivată din CWinApp și sunt apelate din aceasta metodele care formează aplicația.

Fiecare aplicație poate conține o singură clasă derivată din CWinApp și clasa respectivă trebuie să fie globală. Clasele derivate din CWinApp furnizează informații globale despre obiectul aplicației (cum ar fi informații despre instanță). În Visual C++ 6.0, CWinApp moștenește o altă clasă CWinThread. CWinThread definește firul de execuție al unui program. Toate aplicațiile au inițial un fir principal de execuție. În aplicațiile MFC, trebuie să folosim clasa CWinThread în locul funcției CreateThread() din Win32; CWinThread recunoaște clasele MFC, pe când CreateThread() nu le recunoaște.

CDocument este clasa de bază folosită de orice document, furnizează funcții de bază pentru toate documentele, inclusiv crearea, încărcarea și salvarea documentelor. Documentele recunosc documentele MFC și recepționează mesajele MFC prin care li se spune ce trebuie să facă. Utilizatorul nu modifică direct documentul, ci folosește o vizualizare pentru a comunica documentului modificările făcute. Vizualizările știu cărui document îi sunt atașate, iar documentele știu ce vizualizări sunt active. De asemenea, documentele folosesc clase abstracte numite șabloane de document (document template) pentru a determina ce resurse sunt folosite de un anumit document.

Clasa CDocTemplate definește șabloanele de document. CDocTemplate este o clasă de bază abstractă, așa că nu este folosită în mod direct. MFC folosește șabloanele de document pentru a defini relațiile dintre o clasă document, o clasă vizualizare, și o clasă cadru de fereastră. Trebuie să creem un șablon de document pentru fiecare tip de document din apllicație.

Clasa CView gestionează vizualizările, este o clasă de bază pentru toate celelalte clase de vizualizare. Prima dintre acestea este CScrollView, care știe cum să facă defilarea ferestrei cu ajutorul barelor de defilare. Cea de a doua este CEditView, o vizualizarea care știe să facă editarea textului cu ajutorul comenzilor Cut, Paste și Copy. CEditView seamănă cu un control de editare. Ultima clasă este CFormView din CView, care conține controalele. Și CFormView permite defilarea. Atunci când un utilizator interacționează cu aplicația, vizualizările desenează pe ecran ceea ce vede utilizatorul. Dacă utilizatorul modifică conținutul ferestrei, programul comunică aceste modificări clasei Document, astfel încât aceasta se poate actualiza.

MFC creează și gestionează ferestrele cu ajutorul claselor CWnd și CFrameWnd. Deși un obiect CWnd nu este același lucru cu o fereastră Windows, funcționează exact la fel. Clasa CWnd conține funcții membru care manevrează apelurile API asociate de obicei unei ferestre. Un obiect CFrameWnd (care moștenește clasa CWnd) conține, de obicei, vizualizări. Obiectele CFrameWnd recunosc vizualizările și pot realiza funcționalitățile de care depind acestea, cum ar fi actualizarea meniurilor șia barelor cu instrumente. Dacă CFrameWnd este fereastra principală a aplicației, aplicația se termină automat (după ce semnalează că utilizatorul a selectat închiderea aplicației).

Cadrul de lucru manevrează operațiile de intrare/ieșire din fișiere cu ajutorul a două clase : CArhive și CFile. CArhive gestionează o stivă de arhivare și furnizează claselor o modalitate de a-și scrie și de a-și citi propriuil conținut în și dintr-un fișier. CFile realizează operații binare de intrare/ieșire, direct cu fișierele de pe disc. În mod normal, creem un obiect CFile și îl atașăm unui obiect CArhive. Fiecare fișier deschis poate avea un singur obiect CArhive. CArhive poate lucra atât cu tipuri de date primare, cât și cu clase derivate din CObject.

Partea a II –a

Prezentare Visual C++

II.1. Introducere în Visual C++

Visual C++ este cel mai dinamic mediu de programare profesional aflat la dispoziția programatorilor pentru Windows. Acest lucru nu trebuie să pară atât de surprinzător, având în vedere că a fost creat de Microsoft. Cu ajutorul lui Visual C++ puteți crea nu numai aplicații convenționale pentru Windows, ci și programe server și client ActiveX, programe pentru baze de date, controale ActiveX, obiecte programabile și multe altele.

Visual C++ are multe facilități și instrumente performante, cum ar fi AppWizard și ClassWizard. Visual C++ este atât de vast, încât veți avea nevoie de multă muncă până când veți stăpâni toate tehnicile de programare în acest mediu.

În acest capitol voi face o rapidă trecere în revistă a principalelor instrumente care stau la baza mediului de programare Visual C++.

II.2. Instrumente de bază din Visual C++

Deși Visual C++ are mai multe instrumente, pe unele le voi folosi mai mult în operația de creare a aplicației, și anume în prima parte AppWizard, iar în a doua parte a creării aplicației ClassWizard.

II.2.1. AppWizard

Probabil cel mai important instrument din Visual C++ (în afara compilatorului) este AppWizard.

Cu AppWizard se crează întreaga structură a aplicației – inclusiv bara cu instrumente, bara de stare și linia de stare – cu numai câteva click-uri cu mouse-ul. Această structură de bază a aplicației conține toate codurile sursă necesare pentru compilarea și rularea programului principal. Programatorului îi rămâne să adauge codul care determină aplicația să execute operațiile dorite. Acest instrument va fi prezentat mai detaliat în partea a III -a, care prezintă crearea aplicației.

II.2.2. ClassWizard

Un avantaj al generării aplicației cu AppWizard îl constituie faptul că obținem accesul la ClassWizard, care ne poate ajuta, printre altele, să evităm crearea manuală a funcțiilor membru ale claselor și a celor pentru tratarea mesajelor de răspuns. Acest instrument va fi prezentat mai detaliat în partea a III-a, care prezintă crearea aplicației.

II.2.3. Editoare de resurse

Visual C++ are un set complet de editoare de resurse, prin care crearea fișierelor de resurse devine simplă, indiferent dacă vreți să creați o casetă de dialog plină cu controale, o bară de meniuri sau doar o imagine bitmap pentru un buton. Editoarele de resurse din Visual C++ generează automat scriptul necesar copilatorului de resurse pentru crearea fișierului binar de resurse. Aceste instrumente vor fi prezentate mai detaliat în partea a III-a, care prezintă crearea aplicației.

II.2.4. Compilatorul

Elementul central din Visual C++ este, desigur, compilatorul, care transformă codul sursă într-un fișier executabil. Compilatorul nu are un caracter visual pronunțat, afișând numai scurte mesaje în timp ce lucrează, însă puteți selecta multe opțiuni folosind bara de meniuri din Visual C++.

Pentru a rula compilatorul pentru codul sursă creat, selectați butonul Build de pe bara cu instrumente. Compilatorul va începe să lucreze, compilând fișierele care trebuie actualizate. Fișierele care nu au fost midificate sau care nu au legătură cu fișierele modificate, vor fi ignorate de compilator pentru a mări viteza de execuție. Dacă vrem să compilăm toate fișierele, indiferent dacă trebuie sau nu, Visual C++ ne oferă comanda Rebuild All.

II.2.5. Depanatorul

Depanatorul din Visual C++ reprezintă o soluție pentru detectarea acelor fragmente digitale care generează anomaliile de comportament ale programelor create. Pentru a folosi depanatorul, mai întâi trebuie să creați o versiune de depanare a programului. Pentru aceasta nu trebuie decât să configurați proiectul pe Win32Debug și să refaceți programul. Deoarece configurația Win32Debug este cea prestabilită pentru fiecare aplicație nouă, nici măcar nu mai trebuie să umblăm la configurație decât dacă o modificăm. Pentru acesată operație este alocată comanda Set Active Configuration din meniul Build al Visual C++.

Odată compilată versiunea de depanare a proiectului, selectăm comanda Go din depanator pentru rulare. Putem stabili niște puncte de oprire în program precum și o urmărire linie cu linie a execuției.

Pentru o depanare mai detaliată, putem configura o fereastră de urmărire, cu lista tuturor variabilelor a căror valoare ne interesează.

Depanatorul dinVisual C++ are și o fereastră pentru registre, o fereastră pentru memorie și o fereastră cu apelurile de stivă. El poate chiar să desfacă codul sursă și să îl afișeze în formă de limbaj de asamblare.

II.2.6. Fereastra Project Workspace

Lucrul cu atâtea fișiere, categorii și resurse care formează un proiect complet ar deveni un coșmar dacă în Visual C++ nu ar exista fereastra Project Workspace. Această fereastră compartimentată este fixată, în mod normal, în partea stângă a ferestrei principale din Visual C++. Putem să o desprindem trăgând-o cu mouse-ul în orice poziție dorim.

Într-un proiect realizat cu AppWizard, în fereastra Project Workspace apar 3 pagini cu etichete care asigură accesul la toate elementele care formează proiectul. Etichetele asigură accesul la paginile Class View, Resource View și File View.

Pagina Class View afișează clasele programului, aranjându-le în ordine ierarhică. În vârful ierarhiei se află denumirea aplicației. Pe treapta următoare a ierarhie se află clasele ce alcătuiesc proiectul. Sub denumirea claselor sunt afișate toate funcțiile și variabilele membru definite în clasele respective.

Putem sări direct de la oricare funcție din codul sursă executând dublu click pe denumirea ei în pagina Class View. Dacă dorim să vedem fișierul antet al unei clase, care conține declarația clasei, executăm dublu click pe denumirea clasei respective.

În Visual C++ toate funcțiile și variabilele membru sunt marcate cu pictograme care indică tipul și gradul de accesibilitate al membrului. O casetă violetă arată că articolul respectiv este o funcție membru, în timp ce una albastră indică o variabilă membru. În Class View, elementele protejate sunt marcate printr-o cheie, iar cele private printr-un lacăt. Articolele publice nu au nici o pictogramă suplimentară.

Pagina Resource View, afișează toate resursele care sunt definite în proiect. Ca și în cazul paginii Class View, în pagina Resource View toate intrările sunt ordonate ierarhic. În vârful ierarhiei se află denumirea aplicației. Pe treapta inferioară a ierarhiei sunt dispuse diferite tipuri de resurse. Pe nivelul cel mai de jos se află elementele de identificare care reprezintă resursele propriu-zise. Pentru a deschide caseta de dialog în editorul de resurse, executăm dublu click pe elementul de identificare. Putem afișa și alte resurse în editoarele lor de resurse.

Pagina File View, este utilă atunci când doriți să vedeți toate fișierele din proiect. În pagina File View fișierele sunt ordonate ierarhic. În vârful ierarhiei se află denumirea proiectului urmată de denumirea aplicației,de tipurile de fișiere și de fișierele propriu-zise. În pagina File View, toate fișierele sunt marcate prin pictograme care indică tipul fișierului. Puteți încărca fiecare fișier executând dublu click pe denumirea lui din listă.

II.3. Elemente uzuale Windows

II.3.1. Principalele elemente ale interfeței Windows

Interfața grafică cu utilizatorul din Windows include o serie de elemente principale, folosite de obicei nu numai de sistemul de operare, ci și de majoritatea aplicațiilor sub Windows. Cel mai vizibil element din această serie este fereastra, care stă la baza denumirii mediului Windows (Windows – ferestre). Deși nu este un lucru atât de evident, aproape toate elementele grafice care formează interfața grafică sunt ferestre de diferite tipuri. Aceste elemente pot fi elemente de încadrare, casete de dialog, foi de proprietăți și utilitare de asistență interactive (Wizard), cât și diferite controale – de genul butoanelor, casetelor combinate și a casetelor de editare. În paragrafele următoare voi prezenta toate aceste componente.

II.3.1.1. Fereastra

Deși majoritatea elementelor interfeței cu utilizatorul sunt obiecte de tip fereastră, cei mai mulți privesc numai principala suprafață de afișare a aplicațiilor ca fiind o fereastră. Această fereastră este formată din diferite elemente care îi oferă utilizatorului un control total asupra aplicației. În figura următoare este prezentat un exemplu generic de fereastră, în care sunt identificate principalele ei componente. În continuare voi face o enumerare a acestor componente :

Bara de titlu (title bar). Pe bara de titlu este afișată denumirea aplicației împreună cu denumirea documentului deschis. Puteți muta fereastra trăgând de bara ei de titlu cu ajutorul mouse-ului. Fereastra poate fi și maximizată sau readusă la dimensiunile anterioare prin dublu click pe bara ei de titlu.

Bara de meniuri (menu bar). Bara de meniuri asigură accesul la comenzile prin care pot fi controlate aplicațiile sub Windows. Majoritatea aplicațiilor au cel puțin meniurile File, Edit și Help. Alte meniuri standard – cum ar fi Tools, Format și Windows – pot fi necesare pentru a respecta liniile generale de design pentru interfețe ale aplicațiilor sub Windows.

Bara de instrumente (tool bar). Bara de instrumente conține comenzile uzuale ce se regăsesc în subitemurile meniurilor din bara de meniuri. Prin intermediul barei de instrumente totul se face mult mai rapid.

Chenarul ferestrei (window border). Chenarul ferestrei încadrează aplicația și o delimitează de alte elemente de pe suprafața de lucru. Prin tragerea marginilor chenarului cu ajutorul mouse-ului puteți redimensiona fereastra, dacă aplicația permite redimensionarea ferestrei.

Zona client (client area). Zona client reprezintă suprafața în care aplicația își afișează elementele proprii. Adesea, zona client conține o ferestră de afișare – o fereastră fără bară de titlu, chenar, controle sau alte obiecte grafice – în care sunt afișate datele native ale aplicației. De exemplu, un program de prelucrare a textelor poate avea în zona client o fereastră de afișare în care apare documentul aflat în lucru.

Meniul sistemului (system menu). Meniul sistemului include comenzi pentru mutarea, redimensionarea și închiderea ferestrelor. Aplicațiile pot avea și propriile lor comenzi incluse în meniul sistemului, deci acest mod de configurare nu este de dorit.

Butonul de minimizare (Minimize button). Butonul de minimizare îi permite utilizatorului să ascundă aplicația pe bara de taskuri.

Butonul de revenire (Restore button). Butonul de revenire permite readucerea ferestrei la dimensiunile anterioare.

Butonul de maximizarea (Maximize button). Butonul de maximizare îi permite utilizatorului să mărească fereastra până la dimensiunile maxime, ceea ce înseamnă, de regulă, acoperirea totală a ecranului.

II.3.1.2. Casetele de dialog

Casetele de dialog reprezintă un gen deosebit de fereastră, care facilitează comunicarea între utilizator și sistemul de operare. Ele servesc atât la obținerea de informanții de la utilizator, cât și pentru furnizarea de informații utilizatorului. Casetele de dialog conțin adesea o serie de controale – în special butoane și casete de text – care îi permit utilizatorului să facă selectări și să introducă date. Casetele de dialog sunt create, cu un editor de resurse (resource editor), care îi permite programatorului să plaseze controalele prin drag-and-drop în zona de afișare a casetei de dialog. Editorul de resurse generează apoi un fișier de resurse (resource file) pornind de la caseta de dialog creată de programator. Când acesta compilează aplicația, fișierul de resurse este legat de fișierul executabil al aplicației.

II.3.1.3. Casetele de mesaje

Casetele de mesaje sunt un tip deosebit de casetă de dialog, care nu impune existența unui fișier de resurse ca în cazul casetelor de dialog, ceea ce îl scutește pe programator de o muncă în plus. În loc să fie necesară crearea unui script pentru obiectul respectiv, casetele de mesaje sunt incluse în sistem și afișate prin codul de programare. Funcția care creează o casetă de mesaje acceptă o serie de argumente care determină conținutul acestei casete, argumentele fiind textul mesajului, pictograma afișată și butoanele care vor fi incluse. Casetele de mesaje constituie un mod de interacționare rapidă între aplicație și utilizator.

II.3.1.4. Foile de proprietăți

Foile de proprietăți sunt numite adesea casete de dialog cu etichete (tabbed dialog boxes), deoarece conțin etichete pe care le puteți deschide prin click cu mouse-ul. Designul lor le permite programatorilor să includă mai multe opțiuni într-o singură casetă de dialog prin gruparea respectivelor opțiuni pe pagini diferite. Foile de proprietăți sunt folosite adesea în Windows, de la configurarea opțiunilor specifice sistemului, până la modificarea atributelor aplicațiilor

II.3.1.5. Utilitare de asistență interactivă (Wizards)

Pentru a ușura modul de lucru cu Windows, Microsoft a inclus o mulțime de mini-utilitare de tip Wizard, care permit o serie de operații automatizate prin care utilizatorul este ghidat pas cu pas în efectuarea unor operații complexe. Utilitarele Wizard din Windows vă pot ajuta să configurați legătura la Internet, să rezolvați conflicte între dispozitive, să adăugați și să eliminați aplicații și multe altele. Multe aplicații moderne (în special cele produse de Microsoft) conțin și ele utilitare Wizard care îl ajută pe utilizator să efectueze rapid și ușor operații complexe. Utilitarele Wizard sunt foarte asemănătoare cu foile de proprietăți, paginile utilitarelor Wizard nu au etichete. În schimb, utilizatorul trece de la o pagină la alta executând click pe butoane. Deoarece butoanele permit accesul numai la pagina anterioară sau la cea următoare din Wizard, utilizatorul trebuie să parcurgă toți pașii operației într-o ordine succesivă.

II.3.1.6. Controale standard

Windows folosește casete de dialog și alte ferestre pentru a obține informații de la utilizator. Aceste controale include casete de editare pentru introducerea textului, butoane pentru efectuarea de selecții, casete cu listă pentru selectarea articolelor dintr-o listă, casete de validare pentru selectareade opțiuni și multe altele. Aceste controale reprezintă o componentă standard a sistemului de operare. În figura următoare este prezentată o casetă de dialog care conține controale standard pe care le descriu în continuare :

Text static (static text). O linie de text care nu poate fi editat. Controalele cu text static sunt folosite, de regulă, pentru etichetarea altor elemente dintr-o casetă de dialog.

Casetă de editare (edit box). O casetă în care poate fi introdus un text. Textul din caseta de editare poate fi prelucrat și copiat dintr-un loc în altul prin intermediul memoriei Clipboard.

Buton cu apăsare (push button). Butoane care declanșează o comandă când sunt acționate. Butoanele cu apăsare au, de regulă, o etichetă cu text și sunt animate, adică par a fi “apăsate” când execuți click pe ele.

Buton radio (radio button). Butoane folosite, în general, în grup, la un anumit moment putând fi selectat un singur buton. Dacă selectați unul dintre butoanele radio, cel selectat anterior se deselectează.

Casetă de validare (checkbox). Un control folosit pentru activarea și dezactivarea unor opțiuni.Spre deosebire de butoanele radio, casetele de validare permit de regulă selectarea simultană a mai multor opțiuni dintr-un grup.

Casetă cu listă (list box). O listă de articole. Puteți folosi mouse-ul pentru a selecta unul sau mai multe articole din listă. Când în caseta cu listă există mai multe articole decât pot fi afișate, va apărea și o bară de derulare care permite și afișarea articolelor care nu sunt vizibile într-o anumită porțiune a listei.

Casetă combinată (combo box). O listă de articole combinate cu o casetă de editare. Puteți fie să executați click pe săgeata casetei combinate pentru a afișa o listă de opțiuni, fie să introduceți o opțiune în caseta de editare asociată.

Casetă de grup (group box). Folosite pentru gruparea altor controale. De exemplu, o casetă de grup este folosită adesea pentru gruparea unui set de butoane radio. Caseta are și o etichetă care arată conținutul acesteia. În figură este folosit ca etichetă termenul “Options” pentru a defini o casetă de grup cu butoane radio.

II.3.1.7. Elemente comune ale interfeței cu utilizatorul

Pe măsură ce programatorii sub Windows au căpătat mai multă experiență, ei au găsit modalități mai eficiente pentru interacționare cu utilizatorul. Obiectele de genul barelor cu instrumente și a liniilor de stare au început să apară în mai multe aplicații sub Windows. Obiceiul de includere a acestor elemente de interfață în aplicații au generat o adaptare în masă, pe măsură ce tot mai mulți programatori s-au convins de utilitatea lor. Când Microsoft a creat Windows 95, au decis să includă aceste noi tipuri de controale în sistem. Cunoscute ca fiind controale obișnuite, aceste obiecte ale interfeței grafice cu utilizatorul fac parte și din următoarele versiuni Windows, după cum urmează :

Bara cu instrumente (toolbar). O bară cu instrumente este un șir de controale (de regulă, butoane), care asigură un acces rapid la comenzi importante. Butoanele de pe bara cu instrumente sunt, de regulă, duplicate ale comenzilor din menniurile aplicațiilor. O bară cu instrumente poate avea însă și casete cu liste derulante, care vă permit să selectați fonturi, culori și alte atribute pentru documente.

Linia de stare (status bar). Linia de stare reprezintă locul unde pot fi reprezentate descrierile comenzilor aplicațiilor și informații legate de stare, cum ar fi starea tastaturii și poziția cursorului în text. Linia se află, de regulă, în partea de jos a ferestrei aplicației.

Butoane glisante (slider). Un buton glisant este un control pentru selectarea unei valori dintr-o serie de valori. Utilizatorul deplasează butonul glisant pentru a selecta valoarea dorită. Când este deplasat, butonul glisează pe bara pe care se află, fie pe orizontală, fie pe verticală, în funcție de configurația elementului respectiv. Butoanele glisante pot fi folosite și pentru selectarea unei game de valori.

Butoane de incrementare (spinner). Un buton de incrementare reprezintă o altă soluție pentru seșectarea unei valori dintr-o gamă de valori. Elementul de comandă este format din două butoane cu săgeți, care îi permit utilizatorului să crească sau să descrească valoarea afișată.

Bara de evoluție (progress bar). Bara de evoluție reprezintă starea unei operații în derulare prin umplerea suprafeței elementului de control cu o bandă colorată. Pe bară este reprezentată faza de execuție a unei operații. De exemplu, o bară de evoluție poate urmări operația de salvare a unui fișier de mari dimensiuni. Când fișierul este salvat pe jumătate, bara de evoluție va fi umplută pe jumătate.

Afișare în casetă cu listă (list view). Controlul poate afișa un grup ordonat de articole. Modul de afișare a articolelor depinde de configurația curentă pentru afișarea listei. De exemplu, un anumit element poate afișa numai o listă de articole sau poate afișa lista pe coloane, incluzând și detalii despre fiecare articol.

Afișarea în sistem arborescent (tree view). Într-un control cu afișarea în sistem arborescent, articolele sunt afișate în ordine ierarhică. Articolele de rang superior (cum ar fi directoarele de pe disc) pot conține articole subordonate (cum ar fi subdirectoarele sau fișierele de pe disc). Puteți să deschideți și să închideți articolele de rang superior executând click pe ele cu mouse-ul. Prin închiderea unui articol de rang superior, articolul subordonat dispare de pe ecran.

Listă de imagini (image list). O listă de imagini este asemănîătoare cu o inșiruire de imagini. Un control pentru o listă de imagini conține imaginile de pe bara cu instrumente sau imaginile folosite pentru afișarea structurii arborescente într-un control de afișare în sistem arborescent. O listă cu imagini poate conține imagini care au utilizări diferite. De exemplu, puteți folosi o listă cu imagini pentru stocarea unui grup de imagini care formează o secvență animată. Imaginile sunt stocate în memorie și nu pot fi afișate pe ecran decât atunci când sunt cerute de program.

II.3.1.8. Fișiere de resurse

Aproape toate aplicațiile Windows au fișiere de resurse care definesc multe dintre elementele interfeței cu utilizatorul afișate de aplicație, constituind totodată și un mediu de stocare pentru diferitele tipuri de date necesare programului. Aceste elemente sunt casetele de dialog, meniurile și alte obiecte importante cu care utilizatorii mediului Windows sunt obișnuiți să le găsească în aplicații. În continuare sunt descrise toate tipurile de date pe care le puteți defini și stoca într-un fișier de resurse :

Casete de dialog (dialog boxes). Toate casetele de dialog dintr-o aplicație trebuie să fie definite într-un fișier de resurse. Definiția ca resursă a casetei de dialog include elementele stil (valori care determină aspectul și funcționarea casetei de dialog), cât și dimensiunea și poziția controalelor pe care le conține.

Bare de meniuri (menu bar). Bara de meniuri a aplicației trebuie și ea definită într-un fișier de resurse. Într-un fișier sunt specificate comenzile din meniuri și elementele de identificare ale comenzilor, cât și pozițiile comenzilor în meniuri.

Imagini bitmap (bitmaps). Imaginile bitmaps sunt folosite pentru crearea interfeței aplicației cu utilizatorul. De exemplu, puteți crea un set de imagini bitmap pentru desenele de pe butoanele barei cu instrumente. Puteți să folosiți imagini bitmap care să fie afișate în casetele de dialog sau în alte ferestre. Imaginile bitmap pot fi definite bit-cu-bit în cadrul unui fișier de resurse. În general însă, programatorul creează o imagine bitmap folosind un editor de imagini, adăugând apoi denumirea fișierului cu imaginea bitmap în fișierul de resurse.

Pictograme (icons). Pictogramele sunt imagini de mici dimensiuni, de tipul imaginilor bitmap. Totuși, în timp ce imaginile bitmap pot avea orice dimensiuni, pictogramele sunt mult mai mici, de regulă având 16 x 16 sau 32 x 32 pixeli. Pictogramele pot fi folosite în numeroase dintre modurile în care sunt folosite imaginile bitmap. Totuși, pictogramele sunt folosite frecvent pentru a simboliza reprezentarea aplicației minimizate, pentru imaginile care reprezintă tipul de document din aplicație și în alte situații similare.

Tabele de șiruri (string tables). Tabelele de șiruri sunt exact ceea ce sugerează denumirea lor, adică niște tabele cu linii de text. Adesea, textul dintr-un tabel de șiruri este folosit pentru afișarea de indicații referitoare la un instrument corespunzând unei comenzi de meniu sau pentru afișarea mesajelor de eroare și a altor tipuri de mesaje în casete de dialog sau în casete cu mesaj. Puteți totuși să folosiți linii de text într-un tabel de șiruri oricum doriți. Pentru a accesa o linie de text dintr-un tabel de șiruri, trebuie să specificați elementul de identificare al acesteia, care este asociat cu linia de text respectivă în fișierul de resurse care definește tabelul.

Cursoare (cursors). Un cursor este imaginea care indică poziția mouse-ului pe ecran. Deși mediul Windows are mai multe tipuri de cursor pe care le puteți aloca mouse-ului, puteți să vă creați imagini proprii. Astfel de cursoare personalizate pot fi definite în fișierul de resurse al aplicației.

Acceleratoare (accelerators). Acceleratoarele sunt cunoscute și sub denumirea de comenzi rapide (hot key). Acestea sunt combinații de taste care pot fi folosite de utilizator pentru a selecta imediat o anumită comandă, fără să fie necesar să găsească acea comandă într-un meniu al aplicației. De exemplu, majoritatea aplicațiilor folosesc combinația Ctrl+V drept comandă rapidă pentru comanda Paste din meniul Edit. Acceleratoarle sunt definite într-un tabel, în care combinațiile de taste sunt asociate cu elementul de identificare al comenzii.

Resurse personalizate (custom resources). Resursele personalizate sunt toate celelalte tipuri de date pe care vreți să le stocați în fișierul de resurse. Ele pot fi text sau date binare; în programul creat puteți să folosiți resursele personalizate în orice mod doriți. Fișierul de resurse nu are alt rol decât cel de mediu de stocare. Dacă optați pentru crearea unei resurse personalizate, se evită încărcarea datelor din fișiere de pe disc, deoarece datele sunt încărcate automat împreună cu fișierul de resurse.

La începutul programării sub Windows, se creau fișiere de resurse

manual, scriind un script pentru resurse cu ajutorul unui editor de text. Scriptul pentru resurse era apoi compilat într-o reprezentare binară a resursei respective, care apoi era atașată la fișierul executabil al aplicației. Fișierele de resurse au și în prezent o formă text și una binară, dar acum programatorii folosesc editoare vizuale pentru a le crea. Editoarele generează scriptul pentru resurse pornind de la obiectele create de programator în editorul respectiv. Compilatorul pentru resurse prelucrează apoi scriptul rezultat la fel ca în cazul scripturilor create manual.

Partea a III –a

Realizarea și prezentarea aplicației “Agenda”

III.1. Realizarea aplicației “Agenda”

III.1.1. Crearea structurii aplicației “Agenda”

Primul pas in crearea aplicației Agenda constă în realizarea structurii ei cu App Wizard. App Wizard poate genera circa 90% din codul sursă necesar pentru funcționarea aplicației. Tot ceea ce trebuie să faceți dumneavoastră este să adăugați câteva funcții și să modificați funcțiile și resursele existente pentru a finaliza aplicația. Pentru a realiza structura aplicației, efectuați pașii următori :

Deschideți Visual C++. Selectați din meniu opțiunea File. Pe ecran va apărea lista comenzilor aferente acestei opțiuni, iar apoi comanda New. După aceasta pe ecran va apărea pagina de dialog New ca în figura 2.

Figura 1 : Meniul mediului de dezvoltare Visual C++ 6.0

Selectați MFC AppWizard (exe) din foaia etichetei Projects din pagina de dialog New. Aici puteți da o denumire proiectului și puteți alege locul unde vreți să fie salvat codul sursă. Pentru aceasta, scrieți “Agenda” în caseta “Project name”, respectiv selectați un dosar în caseta “Location” pentru salvarea codului sursă, prin efectuarea unui click pe butonul aferent căsuței. Executați click pe OK. Pe ecran va apărea pagina de dialog MFC AppWizard Step 1 ca în figura 3.

Figura 2 : Pagina de dialog New; puteți alege platforma și introduce denumirea aplicației, și puteți alege locul unde vreți să salvați codul sursă.

În pagina de dialog MFC AppWizard Step 1 puteți selecta tipul de aplicație pe care vreți să îl creați. Pentru acest exemplu, selectați opțiunea “Dialog based” , ca în figura 3, pentru ca AppWizard să știe că vreți să creați o aplicație Dialog. Executați click pe butonul Next; pe ecran va apărea pagina de dialog Step 2 ca în figura 4.

Figura 3 : Pagina de dialog MFC AppWizard Step 1 puteți selecta tipul de aplicație pe care vreți să îl creați, precum și limba care va fi folosită pentru resursele aplicației.

În pagina de dialog MFC AppWizard Step 2 puteți selecta tipul de facilități pentru automatizare (Automation) sau pentru controale ActiveX. Pentru aplicația Agenda, lăsați selecția pentru ActiveX pentru că Agenda necesită facilități ActiveX, și dezactivați opțiunea “Automation”, ca în figura 4. Lăsați selectate opțiunile “3D controls” și “About box”, pentru elemente de comandă 3D, respectiv dialogul About. Executați click pe butonul Next pentru a deschide pagina de dialog Step 3 ca în figura 5.

Figura 4 : Pagina de dialog AppWizard Step 2; puteți selecta tipul de facilități pentru automatizare care vreți să fie inclus în aplicație.

În pagina de dialog MFC AppWizard Step 3 puteți configura aplicația pentru a genera comentarii în fișierele sursă, și puteți stabili modul în care vor fi legate de aplicație bibliotecile MFC. Pentru aplicația Agenda, selectați opțiunea ”As a statically linked library” ca în figura 5, care determină aplicația să ruleze în orice sistem, fără să fie necesară instalarea bibliotecii MFC DLL. De asemenea puteți opta pentru generarea comentariilor în fișierele aplicației selectând opțiunea “Yes, please”. Executați click pe butonul Next; pe ecran va apărea pagina de dialog Step 4 ca în figura 6.

Figura 5 : Pagina de dialog MFC AppWizard Step 3; puteți genera comentarii în fișierul sursă și alege modul de folosire a bibliotecii MFC.

Pagina de dialog MFC AppWizard Step 4 creează clasele pentru aplicație. Pentru aplicația Agenda, executați click pe butonul Finish pentru a accepta clasele afișate, ca în figura 6. Pe ecran va apărea pagina de dialog New Project Information ca în figura 7.

Figura 6 : Pagina de dialog MFC AppWizard Step 4 creează clasele aplicației.

În pagina de dialog New Project Information sunt afișate specificațiile pentru structura aplicației. După ce le analizați, executați click pe OK și revizuiți conținutul structurii de proiect pe care urmează să îl creeze AppWizard, ca în figura 7. AppWizard va genera codul sursă pentru structura aplicației și va deschide spațiul de lucru pentru proiect.

Figura 7 : Pagina de dialog New Project Information; aici sunt afișate specificațiile pentru aplicație, clasele aplicației și fișierele aferente lor, precum și calea dosarului în care se află aplicația.

În acest moment ați încheiat prima etapă de creare a aplicației Agenda. Pentru a rula aplicația Agenda, selectați comanda Execute Agenda.exe din meniul Build. Visual C++ vă întreabă dacă doriți să creați fișierul executabil al aplicației. Executați clic pe Yes, iar Visual C++ va compila, va stabili legăturile și va deschide aplicația.

Fișierele generate de AppWizard pentru aplicația creată sunt realizate

pe baza opțiunilor selectate de dumneavoastră în AppWizard. Însă, în orice aplicație creată cu AppWizard apar mai multe clase.

Când generați aplicația Agenda, veți obține fișierele cu cod sursă din tabel.

Nume Descriere

Agenda.h Acesta este fișierul antet pentru clasa CAgendaApp, care reprezintă obiectul aplicației Agenda. Fișierul antet declară clasa, dar fișierul .cpp al clasei este cel care o implementează. Clasa pentru caseta de dialog About a aplicației, CAboutDlg, este și ea declarată de fișierul antet.

Agenda.cpp Acesta este fișierul pentru implementarea clasei CAgendaApp. Această clasă inițializează aplicația și se ocupă de comenzile New, Open și Print Setup din meniul File. Clasa pentru caseta de dialog About a aplicației, CAboutDlg, este și ea definită în acest fișier.

AgendaDlg.h Acesta este fișierul antet pentru clasa CagendaDlg; această clasă este asociată dialogului aplicației.

AgendaDlg.cpp Acesta este fișierul pentru implementarea clasei CAgendaDlg.

Agenda.rc Acesta este fișierul de resurse pentru Agenda. Înaintea modificării resurselor, Agenda.rc conține caseta de dialog About, pictograma și tabelul de șiruri ale programului, în configurația prestabilită. În acest tip de fișiere se pot defini și stoca următoarele tipuri de date : casete de dialog – elemente de stil, dimensiunea, poziția; bare de meniuri – comenzile din meniuri, elementele de identificare ale comenzilor, pozițiile comenzilor în meniuri; imagini bitmap – pentru desenele de pe butoanele barei de instrumente, pentru casete de dialog, pentru ferestre; icon-uri – pentru reprezentarea aplicației minimizate, pentru imaginile care reprezintă tipul de document din aplicație; string table-uri – pentru indicații despre comenzi din meniu, pentru diferite afișări în casetele de dialog sau de mesaj; cursoare – se pot crea imagini proprii; acceleratoare – pentru selectarea imediată a unei comenzi.

Dupa ce am creat aplicația avem fișierele :

În DIR Agenda :

Agenda.aps, Agenda.clw, Agenda.cpp, Agenda.dsp, Agenda.dsw, Agenda.h, Agenda.ncb, Agenda.opt, Agenda (html), Agenda.rc, AgendaDlg.cpp, AgendaDlg.h, ReadMe, Resource.h, StdAfx.cpp, StdAfx.h .

În DIR res :

Agenda (icon), Agenda.rc2 .

În DIR Debug :

Agenda (exe), Agenda.ilk, Agenda.obj, Agenda.pch, Agenda.pdb, Agenda.res, AgendaDlg.obj, StdAfx.obj, vc60.idb, vc60.pdb .

III.1.2. Construirea aplicației “Agenda”

III.1.2.1. Modelarea interfeței aplicației “Agenda”

Configurarea dialogului, aspect – proprietăți

Dialogului creat, îi putem configura aspectul precum și proprietățile. În momentul în care dialogul are focusul, prin apăsarea tastei ENTER pe ecran va apărea caseta “Dialog Properties” unde se poate preciza titlul ferestrei dialogului în caseta “Caption”, se poate adăuga ferestrei un meniu prin alegerea unuia (trebuie creat mai întâi unul) din caseta “Menu”, și se pot preciza coordonatele la care să apară fereastra în momentul lansării aplicației. Se poate alege fontul și mărimea fontului, din caseta “Select Dialog Font” afișată pe ecran la apăsarea butonului “Font…”.

Caseta “Dialog Properties”, foaia “General”, permite stabilirea titlului ferestrei de dialog, precum și adăugarea unui meniu ferestrei.

Caseta “Select Dialog Font” permite selectarea fontului dorit și a mărimii acestuia.

Caseta “Dialog Properties”, foaia “Styles”, permite adăugarea meniului sistem, a barei de titlu, precum și configurarea altor opțiuni.

III.1.2.2. Adăugarea de controale în dialog, tratarea mesajelor acestora și adăugarea de membrii

Adăugarea controalelor statice

După crearea dialogului, îi putem adăuga acestuia controale cu ajutorul mouseului, și anume : în bara de controale “Controls” se efectuează un click cu mouse-ul pe tipul de control dorit, iar apoi se efectuează un click în locul unde doriți să apară controlul, și acesta va apărea în locul respectiv. În acest moment controlul va avea focusul, și prin apăsarea tastei ENTER se va activa pe ecran caseta cu proprietăți aferentă. Aici, în foaia “General” veți putea stabili id-ul controlului în caseta “ID”, precum și configura unele opțiuni.

Editorul de resurse Visual C++ 6, unde puteți realiza redimensionarea dialogul și puteți adăuga controale.

Caseta de proprietăți a controlului (static text) adăugat. Prin selectarea foilor “Styles” și “Extended Styles”, puteți alege alinierea textului controlului în caseta “Align text:” și puteți configura aspectul controlului creat prin selectarea celorlalte opțiuni.

Caseta de proprietăți a controlului (static text) adăugat; caseta “ID” conține id-ul controlului, iar caseta “Caption” conține textul care va fi afișat în control.

Adăugarea controlului calendar

Controlul de tip calendar se adaugă prin selectarea sa cu mouse-ul din bara de controale “Controls” și apoi prin efectuarea unui click în locul dorit din dialog.

Caseta de proprietăți a controlului de tip calendar; conține id-ul controlului.

Foaia “Styles” permite configurarea opțiunilor : încercuirea zilei curente, afișarea datei curente, afișarea numărului din an a săptămânilor și altele.

Adăugarea controlului dată – timp

Controlul de tip dată – timp se adaugă prin selectarea sa cu mouse-ul din bara de controale “Controls” și apoi prin efectuarea unui click în locul dorit din dialog.

Caseta de proprietăți a controlului de tip dată – timp; conține id-ul controlului.

Foaia “Styles” permite configurarea opțiunilor : formatul datei, alinierea conținutului controlului, permiterea editării ferestrei controlului.

Tratarea mesajelor controlului dată – timp

După adăugarea controlului în dialogul aplicației, prin efectuarea unui click dreapta cu mouse-ul pe acesta pe ecran va apărea o listă de opțiuni. Dintre acestea noi vom alege opțiunea “ClassWizard…” conform figurii de mai jos, și pe ecran va apărea caseta “MFC ClassWizard” se vom putea realiza tratarea mesajelor controlului ales.

Editorul de resurse Visual C++ 6; prin efectuarea unui click dreapta pe controlul dorit veți putea apoi accesa caseta “MFC ClassWizard”.

În caseta “MFC ClassWizard”, în foaia etichetei “Message Maps”, în caseta “Object IDs:” veți putea observa id-urile controalelor adăugate până în acest moment în dialog. Dacă ați efectuat pașii anteriori pentru a accesa această casetă, în lista id-urilor va fi selectat id-ul controlului dată-timp, iar dacă nu este așa efectuați un click cu mouseul pe id-ul controlului.

În acest moment în lista alăturată a mesajelor “Messages:” sunt prezentate toate mesajele disponibile pentru controlul selectat. Prin alegerea unuia dintre aceste mesaje, în dreptul etichetei “Description:” va apărea o mică explicație cu privire la ceea ce indică mesajul selectat, iar butonul “Add Function…” va deveni activ, moment în care prin apăsarea sa pe ecran va apărea caseta “Add Member Function” pentru adăugarea funcției acestui mesaj.

Caseta “Add Member Function” prin care putem adăuga o funcție unui mesaj (specificat la eticheta “Message:”) al unui control (specificat la eticheta “Object ID:”) prin apăsarea butonului OK.

După ce am realizat adăugarea funcției mesajului dorit, numele acestei funcții va apărea în caseta “Member functions:” (selectată), iar identificatorul mesajului respectiv din caseta “Messages:” (selectat) va fi de acum îngroșat față de identificatorii mesajelor care nu au încă adăugată o funcție.

În acest moment butonul “Edit Code” a devenit activ, și prin apăsarea sa vom putea accesa fișierul sursă care conține funcția adăugată, poziționându-ne chiar în interiorul codului ei.

Adăugarea butoanelor în aplicație

Adăugarea unui buton se realizează prin selectarea sa cu mouse-ul din bara de controale “Controls” și apoi prin efectuarea unui click în locul dorit din dialog. Apoi prin apăsarea tastei ENTER pe ecran va apărea caseta de proprietăți a butonului.

Caseta de proprietăți a butonului adăugat; puteți stabili id-ul butonului, textul ce va fi conținut în buton, precum și alte proprietăți.

Foaia “Styles” a casetei de proprietăți; puteți configura aici tipul butonului (icon, bitmap), alinierea sa în dialog precum și alte opțiuni.

Tratarea mesajelor butoanelor

După adăugarea butonului în dialogul aplicației, prin efectuarea unui click dreapta cu mouse-ul pe acesta pe ecran va apărea o listă de opțiuni. Dintre acestea noi vom alege opțiunea “ClassWizard…” conform figurii de mai jos, și pe ecran va apărea caseta “MFC ClassWizard” și vom putea realiza tratarea mesajelor butonului.

Accesarea casetei “MFC ClassWizard” pentru tratarea mesajelor butonului.

În caseta “MFC ClassWizard” putem realiza tratarea mesajelor butonului prin selectarea id-ului butonului, din lista id-urilor, moment în care în caseta “Messages” va apărea lista mesajelor asociate butonului. Putem alege acum mesajul dorit, moment în care se va activa butonul “Add Function”, și prin apăsarea sa pe ecran va apărea caseta “Add Member Fuction” care va conține numele funcției ce va fi creată. Acum trebuie doar apăsat butonul OK și funcția va fi creată.

Codul funcției create va conține doar codul necesar funcționării acesteia, sau va putea conține doar antetul funcției. Pentru ca funcția să realizeze anumite operații asupra datelor aplicației, rămâne în sarcina programatorului completarea codului, și aceasta se poate realiza prin alegerea butonului “Edit Code”, care ne va poziționa în fișierul sursă în codul funcției mesajului respectiv.

Adăugarea funcției pentru tratarea unui mesaj al butonului adăugat în dialogul aplicației.

Dacă unui mesaj i-a fost creată o funcție anterior, id-ul acestui mesaj va apărea îngroșat în lista id-urilor mesajelor, și în momentul poziționării cu mouse-ul pe id-ul mesajului, butonul “Add Member Fuction” nu se va activa, ci se va activa butonul “Delete Member Fuction”. În acest moment prin apăsarea acestui buton putem șterge funcția creată pentru mesajul respectiv, sau putem alege butonul “Edit Code”, acțiune care ne va poziționa în fișierul sursă în codul funcției mesajului respectiv.

Tratarea mesajelor controalelor de tip edit box

După adăugarea controlalelor de tip edit box în dialogul aplicației, care se realizează analog cu adăugarea celorlalte controale, prin efectuarea unui click dreapta cu mouse-ul pe controlul dorit, iar apoi prin alegerea opțiunii “ClassWizard…”, pe ecran va apărea caseta “MFC ClassWizard” și vom putea realiza tratarea mesajelor controlului, analog tratării mesajelor celorlalte controale.

Tratarea mesajelor specifice controalelor de tip edit box.

Adăugarea funcției unui mesaj specific controalelor de tip edit box.

După adăugarea funcției unui mesaj al controlului de tip edit box acest mesaj apare îngroșat în lista de mesaje, iar în caseta “Member functions:” va apărea numele funcției asociate, id-ul controlului al cărui mesaj este tratat, precum și id-ul mesajului.

Adăugarea de membrii controalelor

Pentru adăugarea de membrii controalelor, trebuie să accesăm caseta “MFC ClassWizard” și să alegem eticheta “Member Variables”, moment în care pe ecran va apărea foaia asociată etichetei. Aici se găsește combo box-ul “Class name:”, în care putem alege clasa care conține controalele cărora dorim să le adăugăm membrii. În momentul în care alegem clasa dorită, în lista “Control IDs” se vor găsi id-urile controalelor clasei selectate. Acum putem alege id-ul controlului căruia dorim să îi adăugăm membrii prin simpla selectare cu mouse-ul, iar apoi alegem butonul “Add Variable…” și pe ecran va apărea caseta “Add Member Variable”.

Adăugarea de membrii controalelor prin intermediul casetei “MFC ClassWizard”, foaia “Member Variables”.

În caseta “Add Member Variable” completați numele variabilei în caseta “Member variable name:” și alegeți butonul OK pentru a adăuga un membru de tip valoare controlului ales.

În lista id-urilor se pot observa alăturat membrii controalelor și tipul lor. În caseta “Maximum Characters:” puteți completa (opțional) numărul maxim de caractere pe care doriți să le poată stoca membrul selectat.

În caseta “Add Member Variable” completați numele variabilei în caseta “Member variable name:”, și puteți selecta din caseta “Category:” categoria de membru “Control” pentru a adăuga un membru de tip control.

În momentul alegerii categoriei “Control”, în caseta “Category:”, în caseta “Variable type:” se va schimba selecția din “CString” în “CEdit”.

Alegeți apoi butonul OK și membrul de tip control va fi creat.

Caseta “MFC ClassWizard”; după adăugarea de membrii unui control, id-ul acestuia apare în dreptul fiecărui membru adăugat.

Adăugarea unui combo box

Adăugarea unui combo box se realizează prin selectarea sa cu mouse-ul din bara de controale “Controls” și apoi prin efectuarea unui click în locul dorit din dialog. Apoi prin apăsarea tastei ENTER pe ecran va apărea caseta de proprietăți a combo box-ului.

Caseta de proprietăți a combo box-ului; conține id-ul controlului.

În caseta de proprietăți a combo box-ului, prin selectarea etichetei “Data” pe ecran va apărea foaia aferentă acestei etichete; aici se pot introduce informațiile ce se doresc a fi disponibile. Trecerea la un rând nou se va face prin combinația de taste Ctrl + ENTER.

Prin alegerea etichetei “Styles”, în foaia aferentă se pot configura : modul de afișare (“Type:”), sortarea datelor combo box-ului (“Sort”), existența barei de defilare verticală (“Vertical scroll”), afișarea datelor cu litere mari (“Uppercase”), respectiv mici (“Lowercase”), și altele.

Caseta de proprietăți a combo box-ului, foaia “Styles”.

După setarea conform dorințelor a opțiunilor din caseta de proprietăți a combo box-ului și închiderea ei, prin efectuarea unui click pe butonul combo box-ului, pe ecran va apărea un dreptunghi sub forma unei selecții. Prin poziționarea cu mouse-ul pe pătrățelul albastru și prin efectul drag and drop putem redimensiona lista combo box-ului.

Adăugarea de membrii controalelor combo box

Adăugarea membrilor controalelor de tip combo box se realizează prin efectuarea unui click dreapta cu mouse-ul pe control, moment în care pe ecran apare lista de opțiuni din care alegeți opțiunea “ClassWizard…”. Astfel ați accesat caseta MFC ClassWizard, unde trebuie să alegeți eticheta Member Variables.

În acest moment prin simpla selectare cu mouse-ul a id-ului controlului din lista “Control IDs:”, iar apoi alegerea butonului “Add Variable…” pe ecran va apărea caseta “Add Member Variable”.

În caseta Add Member Variable puteți stabili numele membrului pe care doriți să-l adăugați, precum și categoria sa.

Tratarea mesajelor unui combo box

Pentru realizarea tratării mesajelor trebuie să accesați caseta MFC ClassWizard, din care să alegeți eticheta Message Maps, iar aici, din lista id-urilor controalelor, “Object IDs:” id-ul controlului. În acest moment în lista mesajelor asociate controlului, “Messages:” puteți alege mesajul pe care doriți să-l tratați. După ce ați efectuat selectarea mesajului dorit, butonul “Add Function…” devine activ, moment în care prin simpla apăsare a sa veți realiza tratarea mesajului selectat, prin adăugarea unei funcții mesajului. Desigur funcția adăugată va trata mesajul dar nu va avea nici un efect deocamdată. Pentru ca funcția să facă ceva trebuie să-i adăugați cod.

Caseta MFC ClassWizard; tratarea mesajelor unui combo box.

În caseta Add Member Function, prin simpla apăsare a butonului OK adăugăm funcții pentru tratarea mesajelor controalelor. Se poate observa id-ul mesajului ales în dreptul etichetei “Messages:”, iar id-ul obiectului căruia îi este asociat mesajul în dreptul etichetei “Object ID:”. Numele funcțiilor se pot modifica după dorință, dar nu se recomandă acest lucru.

Caseta Add Member Function, cu ajutorul căreia adăugăm funcții pentru tratarea mesajelor controalelor.

Se poate observa că după adăugarea unei funcții mesajului ales, acesta apare distinctiv îngroșat față de celelalte mesaje ale controlului respectiv care nu au încă adăugată o funcție (vezi “Member functions”).

Caseta MFC ClassWizard; adăugarea de funcții mesajelor unui combo box.

III.1.2.3. Editorul de icoane

După cum am mai menționat, mediul Visual C++ 6.0 are mai multe editoare, pe care programatorii le pot folosi pentru editarea fiecărui tip de resurse. Editorul de icoane este unul dintre cele mai ușor de utilizat, oferind în același timp unelte practice și puternice, și un set de culori. În acest editor mouse-ul este la el acasă, acesta fiind intermediarul dintre programator și uneltele editorului de icoane al mediului Visual C++ 6.0, mouse care vă ajută să realizați selectări, colorări, ștergeri și redimensionări.

Editorul de resurse al mediului Visual C++ 6.0.

III.1.2.4. Inserarea bitmap-urilor în dialoguri

Pentru inserarea unui bitmap deja creat în aplicație, fișierul *.bmp trebuie să existe în directorul res al aplicației.

De menționat că dimensiunea bitmap-ului trebuie să fie mai mică decât cea a dialogului dacă doriți ca bitmap-ul să ocupe doar o parte din suprafața dialogului, sau egală cu cea a dialogului, dacă doriți ca bitmap-ul să ocupe toată suprafața dialogului. Deci se dimensionează resursa pentru a se potrivi în dialog.

Redimensionarea bitmap-ului se poate face cu ajutorul aplicației Microsoft Photo Editor dacă are mai mult de 256 de culori și nu se deschide în editorul Visual C++, sau se poate chiar converti imaginea dacă nu este de tip bitmap, tot cu ajutorul lui Microsoft Photo Editor.

Inserarea se realizează prin alegerea din meniul Insert a opțiunii Resource. Pe ecran va apărea caseta Insert Resource din care veți putea alege din caseta “Resource type:” tipul de resursă pe care doriți să îl inserați, respectiv “Bitmap”. După ce ați ales tipul resursei puteți apăsa butonul “Import…”, moment în care pe ecran va apărea caseta “Import Resource”.

Caseta Insert Resource în care se poate alege tipul de resursă dorit.

Caseta Import Resource, cu ajutorul căreia puteți alege bitmap-ul.

Am ales fișierul “UVT.bmp” și ca urmare pe ecran a apărut editorul de resurse de tip bitmap, iar imaginea conținută în fișierul nostru s-a încărcat în editor (dacă are mai puțin de 256 de culori).

După dimensionarea bitmap-ului se alege din caseta Controls controlul Picture și se inserează în locul dorit din dialog. Apoi, prin efectuarea unui click dreapta cu ajutorul mouse-ului, iar lista de opțiuni ce apare pe ecran se alege “Properties”. În caseta Picture Properties, foaia General, se selectează din caseta “Type:” opțiunea “Bitmap”, moment în care caseta “Image:” va deveni activă.

Caseta “Picture Properties”; inserarea unui bitmap.

În caseta “Image:” selectați id-ul resursei bitmap pe care ați inserat-o în aplicație și apoi apăsați tasta ENTER. În acest moment caseta “Picture Properties” se va închide, iar în fereastra dialogului, în locul inserării controlului “Picture”, va apărea imaginea bitmap-ului inserat. Ne mai rămâne de realizat doar centrarea imaginii în locul destinat, cu ajutorul săgeților tastaturii.

Dacă vom dori mai târziu să schimbăm imaginea, vom putea realiza acest lucru efectuând un click dreapta cu mouse-ul pe id-ul bitmap-ului, în fereastra workspace și alegerea opțiunii “Properties”, moment în care pe ecran va apărea caseta “Bitmap Properties”.

Accesarea casetei de proprietăți a bitmap-ului “Bitmap Properties”.

În caseta “Bitmap Properties”, prin schimbarea numelui fișierului asociat resursei, veți realiza schimbarea imagini ce se va afișa în dialog. În acest caz imaginea are mai multe de 256 de culori și nu poate fi afișată în caseta “Preview:”.

Menționez faptul că fișierul pe care doriți să îl asociați ca resursă, trebuie să existe deja în directorul res al aplicației.

III.2. Prezentarea aplicației “Agenda”

Aplicația de față se numește “Agenda” și am construit-o în scop practic dar și ca un exercițiu de programare MFC. Am utilizat o platformă “Dialog Based”, în care am folosit multe dintre controalele uzuale din Visual C++ 6.0.

Această aplicație este o agendă, și nu este una tipărită pe hârtie, nici una electronică, cu baterii și memorie finită, ci una soft, rapidă și performantă, pe care o puteți utiliza pe calculatorul personal.

În momentul lansării aplicației “Agenda” pentru prima dată, aplicația va afișa data curentă în edit box-ul poziționat în colțul stânga sus al ferestrei dialogului, și în edit box-ul care se află poziționat sub caseta “Ziua curentă :”, în format “zz-ll-aaaa”.

Veți putea observa în ferestra dialogului, puțin mai jos, un grup de edit box-uri pe fond alb. În aceste edit box-uri veți putea introduce informațiile dorite, cronologic, conform programului zilei respective. Fiecare din aceste edit box-uri are asociat în stânga sa câte un edit-box pe fond gri, care specifică intervalul orar la care se referă edit box-ul pe fond alb.

Sub grupul de edit box-uri prezentat mai sus se află un alt edit box, asociat etichetei “Evenimente :”, în care puteți completa spre exemplu numele unui prieten a cărei zi de naștere este în data curentă.

Fereastra aplicației conține și un control de tip calendar, care vă oferă informații utile cum ar fi : luna curentă și anul curent în partea de sus a controlului; ziua curentă din lună, care apare încercuită cu roșu și pe fond albastru; ziua din săptămână, prin afișarea în partea de sus a calendarului a inițialei (sau după caz primele două litere) zilei săptămânale; numărul din an al săptămânii, în partea din stânga a calendarului.

Cu ajutorul calendarului conținut în acest control puteți consulta, orice dată calendaristică începând cu data de “31 august 1752”. Consultarea calendarului se poate realiza în diferite moduri, în funcție de dorința utilizatorului :

se poate observa că acest calendar afișează pe lângă zilele lunii curente și ultimele zile ale lunii precedente, care apar mai puțin pronunțat, dar și primele zile ale lunii viitoare, care de asemenea apar mai puțin pronunțat. Prin alegerea cu mouse-ul a uneia din aceste zile care aparțin lunilor precedentă, respectiv viitoare, calendarul va afișa automat luna în care se încadrează ziua selectată. În acest moment luna curentă va deveni precedentă, în cazul în care ați ales o zi din luna următoare, respectiv luna curentă va deveni viitoare dacă ați ales o zi din luna precedentă. Revenirea la luna curentă se face prin operația de selectare din calendar a unei zile aparținătoare ei;

consultarea calendarului se mai poate realiza și cu ajutorul celor două butoane din colțurile de sus ale controlului, care încadrează luna curentă și anul curent. Prin apăsarea butonului din colțul din stânga se realizează poziționarea în luna precedentă, iar prin apăsarea butonului din colțul din dreapta se realizează poziționarea în luna viitoare;

dacă doriți să vă poziționați pe una din lunile anului curent, alta decât luna precedentă sau cea viitoare, pentru a evita parcurgerea tuturor lunilor intermediare celei curente cu cea dorită, prin efectuarea unui click stânga cu mouse-ul pe luna curentă din partea de sus a controlului, pe ecran va apărea lista tuturor lunilor anului. Simpla selecție a lunii dorite vă va poziționa pe acea lună;

poziționarea pe alt an se poate realiza prin efectuarea unui click stânga cu mouse-ul pe anul curent din partea de sus a controlului, și pe ecran va apărea alăturat anului curent, un spin control. În acest moment, prin simpla apăsare a butonului de incrementare sau a butonului de decrementare al spin controlului veți realiza poziționarea pe anul viitor (luna curentă), respectiv pe anul trecut (luna curentă). După apariția spin controlului pe ecran, puteți realiza incrementarea sau decrementarea anului și de la tastatură cu ajutorul săgeților corespunzătoare, sus respectiv jos.

După cum am precizat, controlul calendar are doar un rol consultativ, poziționarea realizată în acesta neafectând în nici un fel aplicația, iar pentru realizarea editării informațiilor unei zile, trebuie să efectuăm poziționarea pe ziua dorită a edit box-ului aferent etichetei “Ziua curentă :”. Acest lucru se realizează prin schimbarea selecției controlului aferent etichetei “Alegeți ziua :”, selecție care va actualiza întotdeauna conținutul controlului aferent etichetei “Ziua curentă :”, conținuturile acestor două controale fiind întotdeauna identice între ele.

Schimbarea selecției controlului aferent etichetei “Alegeți ziua :” se poate face prin apăsarea butonului din stânga controlului. Prin apăsarea acestui buton, pe ecran va apărea un calendar asemănător calendarului consultativ prezentat mai sus, în care veți putea realiza aceleași operații ca și în calendarul consultativ. Spre deosebire de calendarul consultativ, în momentul alegerii unei zile calendarul se va închide, și astfel ați relizat deja poziționarea controlului pe ziua selectată. Veți putea constata că și conținutul controlului aferent etichetei “Ziua curentă :” va fi același, data selectată. În acest moment puteți introduce informațiile dorite în grupul de edit box-uri, acestea înregistrându-se asociate la data curent selectată.

Operația de selectare a datei dorite se poate realiza și cu ajutorul săgeților, atunci când controlul aferent etichetei “Alegeți ziua :” are focusul, și vă puteți da seama de acest lucru prin observarea unei benzi albastre în interiorul controlului. Această bandă poate acoperi grupul de cifre corespunzător zilei, lunii sau anului. Mai întâi trebuie să vă poziționați cu banda albastră pe grupul de cifre pe care doriți să îl modificați, deplasarea între aceste grupuri putându-se realiza prin apăsarea săgeților “stânga”, respectiv “dreapta” ale tastaturii, corespunzător direcției în care se află grupul respectiv de cifre. După realizarea poziționării pe grupul de cifre pe care vreți să îl modificați, prin simpla apăsare a săgeților sus, respectiv jos ale tastaturii, veți realiza poziționarea pe data dorită.

Pe lângă acest instrument pe care l-am creat pentru o poziționare calendaristică mai generală, am creat și câteva instrumente cu un caracter mai practic, și spun “mai practic” având în vedere eventualele solicitări ale aplicației de către utilizatori, pentru că majoritatea evenimentelor sau acțiunilor programate în agenda personală se referă la date calendaristice viitoare apropiate, mai frecvent pe următoarea săptămână, sau din săptămână în săptămână.

Aceste instrumente pe care le-am creat sunt butoanele “Luni”, “Marți”, “Miercuri”, “Joi”, “Vineri”, “Sâmbătă”, “Duminică”, “Ieri” și “Mâine”.

Butoanele “Luni”, “Marți”, “Miercuri”, “Joi”, “Vineri”, “Sâmbătă” și “Duminică” realizează, prin apăsarea lor, o poziționare calendaristică în viitor, pe prima zi cu numele respectiv, deci pe următoarele 7 zile de la data curentă. Spre exemplu, dacă astăzi este o zi de miercuri 12.06.2007, prin apăsarea butonului “Miercuri” veți realiza poziționarea pe data de miercuri 19.06.2007, adică cu o săptămână înainte. Dacă în continuare, veți apăsa butonul “Joi”, vă veți poziționa pe data de joi 13.06.2007, deci pe prima zi de joi care urmează datei curente calendaristice. Deci aceste butoane realizează o poziționare raportată la data calendaristică curentă.

Spre deosebire de butoanele prezentate mai sus, butoanele “Ieri” și “Mâine” realizează o poziționare raportată la data selectată curentă, adică se raportează la data conținută în controlul aferent etichetei “Ziua curentă”. Prin apăsarea butonului “Ieri”, ori de câte ori doriți, veți realiza de fiecare dată poziționarea pe data precedentă celei selectate în control, iar prin apăsarea butonului “Mâine” veți realiza operația “simetrică”, poziționarea pe ziua următoare celei selectate în control.

Dacă doriți să realizați repoziționarea pe data curentă calendaristică, puteți face aceasta într-un mod foarte rapid, trebuie doar să apăsați butonul care poartă numele zilei din săptămână, următoare celei în care vă aflați, și astfel vă veți poziționa pe ziua imediat următoare zilei calendaristice curente, iar apoi să apăsați o singură dată butonul “Ieri”, care va realiza poziționarea cu o zi în urmă față de cea selectată, în control.

Aplicația este prevăzută în colțul din stânga jos cu un grup box “Opțiuni”. Combo box-ul aferent etichetei “Avertizare pe … zile”, inițial va conține cifra 0. Această cifră se referă la faptul că aplicația nu adresează nici o avertizare utilizatorului. De precizat faptul că această opțiune se utilizează în asociere cu ceck box-urile aferente grpului de edit box-uri.

Mai exact, prin selectarea unei alte cifre în combo box, la următoarea pornire a aplicației, aceasta va afișa pe ecran toate informațiile care au controlul ceck bifat, începând cu data curentă și continuând cu atâtea zile următoare câte sunt specificate în control. Menționez faptul că prin poziționarea avertizării înapoi pe 0, aplicația nu va mai efectua nici o avertizare, oricâte bifări ar exista.

Am prevăzut în utilizarea aplicației și situația în care, după ce ați editat programul unei zile, aflați că programul zilei respective s-a anulat sau intervine ceva neprevăzut și acesta se va schimba. Pentru aceasta am dotat aplicația, în grup box-ul “Opțiuni”, cu un buton “Reset”. Prin apăsarea acestuia, pe ecran va apărea o casetă care vă va anunța asupra opțiunii pe care ați făcut-o. În cazul în care ați apăsat din greșeală butonul “Reset”, pentru a nu pierde tot ceea ce este editat în edit box-uri, așteptați două secunde înainte de a confirma operația, și aceasta nu se va realiza. În caz contrar, dacă ați ales operația cu intenția de a reseta conținutul edit box-urilor, confirmați imediat operația și aceasta se va realiza.

Aplicația “Agenda” realizează toate operațiile necesare în gestionarea programului dumneavoastră zilnic.

Bibliografie

Bates Jim, Tompkins Tim, “Utilizarea Visual C++ 6”, Editura Teora, 2000, București

Cecal Liana, “Programare Object Windows”, Editura Agni, 1994, București

Chane Cullens, Mark Davidson, Chris Corry, …, “Utilizare Visual C++ 4”, Editura Teora, 1997, București

Charles Petzold, “Programare în Windows 95”, Editura Teora, 1998, București

Crișan Daniela Alexandra, “Programarea aplicațiilor Visual C++”, Editura Sylvi, 2001, București

Hyman Michael, Arnson Bob, “Visual C++ pentru toți”, Editura Teora, 1996, București

Koller Eduard, Roșculeț Monica E, “Visual C++; programarea aplicațiilor Windows cu MFC”, Editura Teora, 1998, București

Moldoveanu Florica, Hera Gabriel, “Programarea aplicațiilor Windows”, Editura Teora, 1995, București

Moldoveanu Florica, Hera Gabriel, “Programarea aplicațiilor Windows”, Editura Teora, 1993, București

Petrovici Vasile, Goicea Florin, “Programare în limbajul C”, Editura Tehnică, 1993, București

Robison Lyn, “Programarea bazelor de date cu Visual C++”, Editura Teora, 2001, București

Savu Cristian George, “Ghidul programatorului Visual C++ 5.0”, Editura All Educational, 1998, București

Stoicu Tivadar Vasile, “Programare orientată pe obiecte”, Editura Orizonturi universitare, 2000, Timișoara

Turturea Doru, “Programarea aplicațiilor Windows în limbajul C”, Editura Tehnică, 1995, București

Williams Mickey, “Bazele Visual C++ 4”, Editura Teora, 1999, București

Similar Posts

  • Protocoale de Securitate Utilizate In Retelele Wireless

    Protocoale de securitate utilizate în rețelele wireless Cuprins 1.Considerații generale 1.1. Mobilitatea 1.2. Capacitatea de acces 1.3. Divizarea digitală 1.4. Reducerea costurilor 1.5. Riscuri în utilizarea rețelelor wireless 1.6. Furnizarea serviciului wireless combinat 1.7. Revenirea și fiabilitatea nodului informațional 1.8. Tehnologii de internet utilizate pentru rețele Wireless 2. Fundamentele tehnologiei wireless 2.1. Prezentarea standardului IEEE…

  • Proiectarea Sistemului de Gestiune Pentru Constructia Si Depanarea Calculatoarelor

    Introducere În ultimii ani, datorită evoluției rapide a tehnologiei informației, în orice instituție ar trebui să existe un sistem informatic care să asigure buna organizare și funcționare a acesteia. Astfel tehnologiile existente pe piață ne permit dezvoltarea unor sisteme complexe pentru comunicare, prelucrarea datelor precum și transmiterea și stocarea acestora. In prezent mecanismele clasice de…

  • Modelarea Si Simularea Procesului

    1. INTRODUCERE 1.1. Contextul realizării proiectului Lucrarea este un proiect de diplomă realizat în cadrul Facultății de Automatică și Calculatoare, la terminarea cursurilor universitare de ingineri, de lungă durată, de 5 ani, în specialitatea Automatică și Informatică Aplicată. Proiectul rezolvă o temă didactică, de dezvoltare a unei metode de detecției și diagnosticării a defectelor bazată…

  • Proiectarea Unui Sistem Informatic Pentru Activitatea DE Gestiune A Materialelor

    Cuprins Introducere………………………………………………………………………………………..3 Cap.1 Prezentarea S.C. Rigips Roman S.A.și analiza sistemului existent 1.1 Scurt istoric și obiect de activitate…………………………………………………..4 1.2 Structura organizatorică 1.2.1 Organigrama firmei…………………………………………………………………7 1.2.2 Studiul sistemului de conducere…………………………………………………..8 1.2.3 Studiul sistemului condus…………………………………………………………..8 1.2.4 Analiza principalilor indicatori economico-financiari……………………..9 1.3 Studiul sistemului informațional 1.3.1 Prezentarea activității economice 1.3.1.1 Principalii furnizori ai societății…………………………………………………………10 1.3.1.2 Principalii clienți ai…

  • Proiectarea Magazinului Online

    CUPRINS INTRODUCERE ……………………………………………………………………………..pag 3 CAP 1 PLATFORMA WORDPRESS Scurt istoric …………………………………………………………………………………pag 6 Caracteristici generale …………………………………………………………………..pag 8 Scopul și modurile de utilizare ……………………………………………………….pag 10 CAP 2 BAZA DE DATE 2.1 Ce este o bază de date ……………………………………………………………………pag 15 2.2 Scopul și obiectivele bazelor de date………………………………………………..pag 17 2.3 Proiectarea unei baze de date…………………………………………………………..pag 18 CAP 3 CONSIDERAȚII…