Sunteți pe pagina 1din 3

PROGRAMAREA ORIENTATĂ PE OBIECTE - Laborator 

Lucrarea de laborator 5.
Visual C++6.0 – MFC Desenarea şi afişarea imaginilor

Utilizarea documentelor, a reprezentărilor şi a cadrelor

Pentru programatorul în VisualC++, biblioteca MFC oferă un sprijin substanţial la generarea


unei noi aplicaţii prin intermediul AppWizard, care poate să creeze automat un meniu, o bară de
instrumente, o bară de stare şi alte componente, permiţând apoi personalizarea uşoară a fiecărui
element. Clasele create cu AppWizard lucrează împreună pentru a forma o structură omogenă
cunoscută sub numele de arhitectura Document/View.
Conceptul fundamental al arhitecturii Document/View îl reprezintă separarea datelor propriu-
zise de reprezentarea a ceea ce datele semnifică pentru utilizator. Aceasta se realizează stocând datele
într-o clasă (clasa document) şi informaţiile privind reprezentarea într-o altă clasă (clasa vizualizare).
Există două categorii de aplicaţii Document/View: SDI (Single Document Interface) şi MDI
(Multiple Document Interface).

Exerciţiu 1. Să se creeze o aplicaţie de tip SDI cu AppWizard .

Aplicaţia pe care o veţi dezvolta va afişa un teanc de monede. Opţiunile de meniu vor permite
adăugarea sau înlăturarea unei monede din teanc. Datele, care reprezintă de fapt numărul de monede,
sunt reţinute în clasa document, fiind accesate de clasa vizualizare în scopul afişării teancului sau de
clasa cadru pentru actualizare. Deşi este un exemplu simplu, el oferă o imagine asupra scopului
fundamental al arhitecturii Document/View, şi anume încapsularea datelor. Prin încapsulare, datele
sunt stocate exclusiv în clasa document, fiind oferite funcţii de acces care să permită clasei vizualizare
sau clasei cadru să prezinte informaţiile către utilizator, respectiv să permită actualizarea acestor
informaţii.

Folosind opţiunea AddMemberVariabile adăugaţi o variabilă protected cu numele NrMonede


clasei document a proiectului. Această variabilă va iniţializată în funcţia constructor a clasei document
cu valoarea 1.
O variabilă protejată nu poate fi modificată decât prin intermediul funcţiilor membru ale clasei
din care face parte sau ale unei clase derivate. Prevenind alterarea datelor documentului de către oricare
altă clasă, rămâne un singur punct de modificare a unei variabile. Pentru a permite accesul la datele
membre, clasa document trebuie să ofere funcţii de acces sau de modificare a variabilelor membre.

Folosind opţiunea AddMemberFunction adăugaţi trei metode clasei document:


- o metodă int GetNr() care să returneze valoarea datei membre NrMonede,
- două metode void add() şi void rem() pentru incrementarea respectiv decrementarea valorii
variabilei NrMonede.
PROGRAMAREA ORIENTATĂ PE OBIECTE - Laborator 

Pentru ca reprezentarea să poată extrage date ale documentului, ea trebuie să fie mai întâi
capabilă să acceseze obiectul document. Infrastructura MFC se ocupă automat de acest aspect,
adăugând în clasa reprezentare a aplicaţiei metoda GetDocument.
Clasa derivată din CView este responsabilă de afişarea teancului de monede. Codul care se
ocupă efectiv de desenarea monedelor se află în funcţia OnDraw()a clasei respective. AppWizard
creează un schelet al acestei funcţii, care trebuie apoi completat:

void CSDIView::OnDraw(){
//Obtinerea pointerului la document
CSDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//Salvarea pensulei curente
CBrush* pOldBrush=pDC->GetCurrentBrush();
//Crearea unei noi pensule de culoare galbena
CBrush br;
br.CreateSolidBrush(RGB(255,255,0));
//Selectarea pensulei galbene in contextul dispozitiv
pDC->SelectObject(&br);
//Obtinerea numarului de monede de la document si
//reprezentarea fiecarei monede prin doua elipse
for(int i=0;i<pDoc->GetNr();i++){
int y=200-30*i;
pDC->Ellipse(40,y,100,y-30);
pDC->Ellipse(40,y-5,100,y-35);
}
//Restaurarea vechii pensule
pDC->SelectObject(pOldBrush);
}

Exerciţiu 2. Adăugaţi două opţiuni de meniu Add şi Rem pentru adăugarea şi eliminarea unei
monede. Trataţi aceste resurse de meniu în clasa CMainFrame:

void CMainFrame::OnAdd() {
//Obţinerea pointerului spre document
CSDIDoc* pDoc=(CSDIDoc*)GetActiveDocument();
pDoc->add();
//Actualizarea vizualizării documentului
pDoc->UpdateAllViews(NULL);
}
void CMainFrame::OnRem() {
//Obţinerea pointerului spre document
CSDIDoc* pDoc=(CSDIDoc*)GetActiveDocument();
pDoc->rem();
PROGRAMAREA ORIENTATĂ PE OBIECTE - Laborator 

//Actualizarea vizualizării documentului


pDoc->UpdateAllViews(NULL);
}

Acum compilaţi şi executaţi .

S-ar putea să vă placă și