Sunteți pe pagina 1din 25

12

Programarea n C i C++

Fig. 31.12 Pagina General conine caracteristicile paginii de proprieti


1.

Odat afiat caseta de dialog, apsai Enter pentru a afia foaia de


proprieti Dialog Properties. Selectai eticheta General i nlocuii
elementul de identificare ID i cmpul Caption (textul va reprezenta
numele etichetei paginii de proprieti).

2.

Selectai eticheta Styles n foaia de proprieti Dialog Properties. Alegei


Child n caseta Style, Thin n caseta Border i dezactivai opiunea System
Meniu (sunt stilurile de fereastr corespunztoare unei pagini de
proprieti).

Fig. 31.13 Pagina Style conine stilurile pentru pagina de proprieti.


3.

Folosind editorul pentru casete de dialog adugai controalele necesare


n pagina de proprieti i tergei butoanele OK i Cancel (nu se folosesc
ntr-o pagin de proprieti).

13
4.

Programarea n C i C++
Avnd pagina de proprieti selectat apelai programul asistent Class
Wizard utiliznd simultan tastele CTRL i W. Va fi afiat caseta de dialog
Adding a Class. Apsnd butonul OK se va deschide caseta de dialog New
Class:

Fig. 31.14 Adugarea clasei pentru pagina de proprieti


5.

Caseta Name va trebui s conin numele clasei pagin de proprieti,


iar caseta Base Class numele clasei de baz CPropertyPage.

6.

n pasul urmtor, n pagina Member Variable se pot aduga variabile


membru clasei pagin de proprieti pentru controalele cu care va comunica
aplicaia.

7.

Pentru fiecare pagin de proprieti a foii de proprieti se reiau paii de


la 1 la 7.

8.

Folosind simultan tastele CTRL i W apelai programul asistent Class


Wizard i adugai o nou clas folosind butonul Add Class. Selectnd New
n meniul derulant va fi afiat caseta de dialog New Class.

Programarea n C i C++
9.

14

Caseta Name va conine numele clasei foaie de proprieti iar caseta


Base Class numele clasei de baz CPropertySheet.
Dup definirea resurselor foii de proprieti i derivarea claselor paginii i

foii de proprieti din CPropertyPage i CPropertySheet, n continuare se va


programa codul pentru afiarea i utilizarea controalelor foii de proprieti.
10.

n fiierul antet al clasei foii de proprieti vor fi incluse fiierele antet


ale paginilor de proprieti:

#include "NumePrenume.h"
#include "Varsta.h"
11.

n continuare trebuie create obiecte pagin de proprieti ca variabile


membru ale clasei foii de proprieti:

CNumePrenume m_NumePrenume;
CVarsta m_Varsta;

Fig. 31.15 Adugarea variabilelor membru de tip pagini de


proprieti n clasa foii de proprieti

15
12.

Programarea n C i C++
Pentru a aduga paginile de proprieti la clasa foii de proprieti se
apeleaz n constructorul foii funcia AddPage() :

CPropertySheet1::CPropertySheet1(LPCTSTR pszCaption, CWnd*


pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_NumePrenume);
AddPage(&m_Varsta);
}
Acestea sunt operaiile minime care trebuiesc efectuate pentru clasa foii
de proprieti.
13.

n pasul urmtor clasa foii de proprieti va trebui inclus n fiierul CPP


care afieaz foaia de proprieti (al clasei View).

#include PropertySheet1.h
14.

Afiarea pe ecran a foii de proprieti presupune instanierea obiectului


foaie de proprieti i apelarea funciei DoModal( ) n cadrul funciei
mesaj-rspuns :

void CP10View::OnPs1() {
// TODO: Add your command handler code here
CPropertySheet1 obj("PropertySheet1");
int r = obj.DoModal(); }
Parametrul transmis constructorului este denumirea ce apare pe bara de
titlu a foii de proprieti.

Programarea n C i C++

16

Fig. 31.16 Foaie de proprieti cu dou pagini de proprieti


Comunicarea valorilor ntre program i foaia de proprieti funcioneaz
ca la casetele de dialog. Pentru a introduce date prestabilite n controalele foii
de proprieti, variabilele membru ale claselor paginilor de proprieti trebuie
iniializate. De asemenea, se pot extrage date din paginile de proprieti
salvnd, dac valoarea returnat de DoModal() este IDOK, valorile variabilelor
membru ale paginilor de proprieti n variabilele program (definite de exemplu
n clasa View).
31.4. Wizard-ul
Wizard-urile, foarte asemntoare cu foile de proprieti, ndrum
utilizatorul n timpul efecturii operaiilor. Ele utilizeaz butoane n locul
etichetelor pentru trecerea la pagina urmtoare, iar parcurgerea paginilor se
realizeaz n ordine succesiv. Se va construi un Wizard la fel cum s-a procedat

17

Programarea n C i C++

n cazul paginilor de proprieti: resursa caset de dialog a unei pagini a


Wizard-ului se asociaz cu clasa CPropertyPage, iar Wizard-ul este un obiect al
clasei CPropertySheet.
Apelarea funciei SetWizardMode() a obiectului foaie de proprieti face
dintr-o foaie de proprieti un Wizard:
void CP10View::OnW1()
{
// TODO: Add your command handler code here
CWizard1 obj("Wizard1");
obj.SetWizardMode();
int r = obj.DoModal();
}
Wizard-ul trebuie s execute o procedur de iniializare pentru activarea
butoanelor. O pagin din Wizard are trei butoane de tranziie (cazuri speciale
sunt prima i ultima pagin): Back, Next i Finish. Pentru a activa butoanele
paginii din Wizard se apeleaz funcia SetWizardButtons() n cadrul funciei
OnSetActive() (suprascris) a clasei CPropertyPage. Cnd pagina Wizard-ului
trebuie afiat MFC apeleaz OnSetActive().
BOOL CW1::OnSetActive() {
// TODO: Add your specialized code here and/or call the base class
CPropertySheet* pParentSheet = (CPropertySheet*) GetParent();
pParentSheet->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}

Programarea n C i C++
Funcia

OnSetActive()

18
definete

un

pointer

spre

obiectul

CPropertySheet care este printele paginii Wizard. n continuare, prin


intermediul pointerului, se apeleaz funcia SetWizardButtons. Prezentm
constantele care pot fi folosite ca argument pentru funcia menionat:
PSWIZB_NEXT activeaz butonul Next, PSWIZB_BACK activeaz butonul
Back,

PSWIZB_FINISH

activeaz

butonul

Finish,

PSWIZB_DISABLEDFINISH dezactiveaz butonul Finish. Pentru a selecta


butoanele care trebuie activate se folosesc constantele corespunztoare separate
prin semnul |.
Funciile, care pot fi suprascrise, pentru rspuns la acionarea butoanelor
sunt: OnWizardBack(), OnWizardNext(), OnWizardFinish().
LRESULT CW2::OnWizardNext() {
// TODO: Add your specialized code here and/or call the base class
MessageBox("Ai apsat pe butonul Next al pag2");
return CPropertyPage::OnWizardNext();
}

Fig. 31.17 Efectul suprascrierii funciei OnWizardNext()


a paginii 2 a Wizard-ului

19

Programarea n C i C++

32. Controale orientate pe intervale de valori


32.1. Bara de evoluie

Bara de evoluie reprezint grafic, prin umplerea cu dreptunghiuri, starea


unei operaii n derulare. Bara de evoluie este reprezentat n MFC de clasa
CProgressCtrl.
Pentru a obine o bar de evoluie, n primul rnd va fi instaniat un
obiect din clasa CProgressCtrl:
CProgressCtrl obj_progBar;
Dup care va fi apelat funcia Create (), care creeaz bara de evoluie
propriu-zis i o asociaz obiectului CProgressCtrl:
obj_progBar.Create(WS_CHILD | WS_BORDER | WS_VISIBLE, CRect(20,
40, 360, 80), this, IDC_PROGBAR);
Urmeaz configurarea atributelor, domeniului, mrimea pailor i poziia
iniial. Dac bara este utilizat pentru a reprezenta un procentaj, domeniul va lua
valori de la 0 la 100. Mrimea pasului este poriunea care este umplut cnd
controlul este incrementat. De exemplu, pentru o bar de evoluie cu un pas cu
mrimea 10 sunt necesari 10 pai pentru umplerea acesteia. Poziia iniial este
poriunea care a fost deja umplut cnd bara de evoluie este afiat.
Aceste iniializri se fac folosind funciile SetRange(), SetStep() i
SetPos () ale clasei CProgressCtrl:

Programarea n C i C++

20

obj_progBar.SetRange(1, 100);
obj_progBar.SetStep(10);
obj_progBar.SetPos( 0 ) ;
n continuare trebuie incrementat controlul folosind funcia StepIt() pentru a
indica evoluia operaiei.
obj_ progBar.StepIt();
Funcia StepIt() incrementeaz controlul cu mrimea pasului stabilit de funcia
SetStep().

Fig. 32.1 Bara de evoluie.


Funcionarea barei de evoluie
Bara de evoluie este creat n funcia mesaj-rspuns Onbe()
corespunztoare atributului bara de evoluie (obj_progBar variabil membr
de tip CProgressCtrl a clasei CP2View).

21

Programarea n C i C++

void CP2View::Onbe()
{
// TODO: Add your command handler code here
obj_progBar.Create(WS_CHILD | WS_BORDER | WS_VISIBLE,
CRect(20, 40, 300, 60), this, IDC_PROGBAR);
obj_progBar.SetRange(1, 100);
obj_progBar.SetStep(10);
obj_progBar.SetPos(25);
}

Figura 32.1 prezint o bar de evoluie care indic faptul c 25% din
operaie este realizat. Aceasta are domeniul de la 1 la 100, mrimea pasului de 10
i ncepe de la poziia 25. Cnd se execut click n fereastra aplicaiei, Windows
trimite mesajul

WM_LBUTTONDOWN,

procesat de funcia OnLButtonDown (), care

apeleaz SetTimer() pentru a porni ceasul din Windows:

void CP2View::OnLButtonDown(UINT nFlags, CPoint point) {


// TODO: Add your message handler code here and/or call default
SetTimer(1, 250, NULL);
CView::OnLButtonDown(nFlags, point);
}
Argumentele funciei SetTimer() sunt numrul ceasului, numrul de
milisecunde ntre evenimentele de ceas i adresa unei funcii de apelat. Dac ceasul
este pornit, Windows trimite un mesaj WM_TIMER. Prin funcia OnTimer() se poate
rspunde la aceste mesaje. Cnd aplicaia primete un mesaj

WM_TIMER,

MFC

apeleaz OnTimer(), care apeleaz funcia StepIt() pentru incrementarea

Programarea n C i C++

22

controlului, indicnd derularea operaiei prin umplerea cu dreptunghiuri a barei de


evoluie.
void CP2View::OnTimer(UINT nIDEvent) {
// TODO: Add your message handler code here and/or call default
obj_progBar.StepIt();
CView::OnTimer(nIDEvent);
}
32.2. Butonul glisant
Pentru un buton glisant cu domeniul 0-100, se poate selecta de ctre
utilizator valori doar n acest domeniu. Utilizatorul trebuie s deplaseze butonul
folosind mouse-ul sau va folosi tastele direcionale de pe tastatur.

Fig. 32.2 Buton glisant

23

Programarea n C i C++
Pentru a obine un buton glisant, trebuie instaniat un obiect al clasei

CSliderCtrl i apelat funcia membru Create (), care creeaz butonul glisant
propriu-zis i l asociaz obiectului CSliderCtrl:
CSliderCtrl obj_slider;
Prototipul funciei Create () indic urmtoarele argumente: dwStyle indicatoarele de stil ale butonului glisant; rect - un obiect rect sau CRect care
specific mrimea i poziia butonului glisant; pParentWnd - un pointer spre
fereastra printe a butonului glisant i nID - elementul de identificare al
butonului glisant.
BOOL

Create(DWORD

dwStyle,

const

RECT&

rect,

CWnd*

pParentWnd, UINT nlD) ;


Aplicaia P2 creeaz butonul glisant n funcia mesaj-rspuns Onbg()
corespunztoare atributului buton glisant.
void CP2View::Onbg()
{
// TODO: Add your command handler code here
obj_slider.Create(WS_CHILD

WS_VISIBLE

WS_BORDER

TBS_BOTH | TBS_AUTOTICKS | TBS_HORZ, CRect(20, 120, 320, 160),


this, IDC_SLIDER);
obj_slider.SetRange(0, 100, TRUE);
obj_slider.SetTicFreq(10);
obj_slider.SetLineSize (1);

Programarea n C i C++

24

obj_slider.SetPageSize(10);
}
Funcia Onbg() creeaz o scal orizontal cu buton glisant i gradaii
deasupra i sub canalul de glisare i iniializeaz butonul din aplicaie
Butonul glisant are stiluri proprii, n afara stilurilor standard ale
ferestrei. Pentru stilurile ferestrei vor trebui utilizate cel puin stilurile
WS_CHILD i WS_VISIBLE. Butonul glisant prezentat utilizeaz stilul
WS_BORDER pentru ca marginile lui s ias n eviden fa de fundalul alb al
ferestrei. Prezentm n continuare toate aceste stiluri: TBS_AUTOTICKS - d
butonului posibilitatea de a desena indicatoare de gradare; TBS_BOTH afieaz gradaiile pe ambele pri ale canalului de glisare; TBS_BOTTOM afieaz gradaiile n partea de jos a canalului de glisare a butonului;
TBS_ENABLESELRANGE - permite butonului s afieze domenii de selecie;
TBS_HORZ - creeaz o scal orizontal cu buton glisant; TBS_LEFT plaseaz gradaiile pe partea stng a unui canal de glisare vertical;
TBS_NOTICKS - creeaz un canal de glisare cu buton fr gradaii;
TBS_RIGHT - plaseaz gradaiile pe partea dreapt a canalului de glisare
vertical; TBS_TOP - plaseaz gradaiile pe partea superioar a canalului de
glisare orizontal i TBS_VERT - creeaz un canal de glisare vertical cu buton
glisant.
Pentru a stabili domeniul butonului glisant ntre 0 i 100, funcia Onbg()
apeleaz SetRange() (obj_slider variabil membr de tip CSliderCtrl a clasei
CP2View). Apelarea funciei SetTicFreq() stabilete frecvena apariiilor
gradaiilor pe canalul de glisare a butonului glisant. Funciile SetLineSize() i
SetPageSize () determin distana pe care se deplaseaz butonul glisant cnd
utilizatorul apas o tast sau execut click cu mouse-ul. Lungimea liniei

25

Programarea n C i C++

determin valoarea de incrementare cnd utilizatorul folosete tastele cu


sgeat. Mrimea paginii determin valoarea de incrementare cnd utilizatorul
execut click cu mouse-ul pe canalul de ghidare sau cnd apas tastele PageUp
sau PageDown.
Dup ce butonul glisant este afiat, este necesar o metod pentru a afla
cum l manevreaz utilizatorul. La micarea lui, butonul glisant genereaz
mesajul WM_HSCROLL. Pentru a rspunde la aceasta, trebuie adugat n
aplicaie funcia OnHScroll() folosind ClassWizard. OnHScroll () determin
valoarea curent a butonului glisant i convertete valoarea ntr-o linie de text
(pos variabil membr a clasei CP2View care conine poziia cursorului).
Apoi apeleaz prin intermediul funciei Invalidate() funcia OnDraw() care
afieaz linia de text n fereastra aplicaiei.
void CP2View::OnHScroll
(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here
// and/or call default
CSliderCtrl* s = (CSliderCtrl*)pScrollBar;
int p = s->GetPos () ;
wsprintf(pos, "%d ", p);
Invalidate();
CView:OnHScroll(nSBCode, nPos, pScrollBar);
}
void CP2View::OnDraw(CDC* pDC){
CP2Doc* pDoc = GetDocument();

Programarea n C i C++

26

ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(350,135, pos);
}
32.3. Controlul de incrementare
Cea de-a treia metod pentru transmiterea ctre aplicaie a unei valori,
ntr-un domeniu determinat, o reprezint folosirea controlului de incrementare.
Utilizatorul va executa click cu mouse-ul pe sgei pentru a mri/reduce
valoarea afiat.

Fig. 32.3 Controlul de incrementare


Pentru a obine un buton de incrementare, n primul rnd trebuie
instaniat un obiect al clasei CSpinButtonCtrl :

27

Programarea n C i C++

CSpinButtonCtrl obj_spin;
Dup care trebuie apelat funcia Create(), care creeaz controlul de
incrementare propriu-zis i l asociaz obiectului CSpinButtonCtrl. Prototipul
funciei Create() indic urmtoarele argumente: dwStyle - indicatoarele de stil
ale butonului de incrementare; rect - un obiect RECT sau CRect care specific
mrimea i poziia butonului de incrementare; pParentWnd - un pointer spre
fereastra printe a butonului de incrementare i nID - elementul de identificare
al butonului de incrementare.
BOOL Create (DWORLD dwStyle, const RECT & rect, CWnd*
pParentWnd, UINT nID);
Aplicaia P2 creeaz controlul de incrementare (nti controlul nsoitor
obj_spinEdit al controlului de incrementare, apoi controlul de incrementare
obj_spin) n funcia mesaj-rspuns Onci() corespunztoare atributului controlul
de incrementare. Ambele obiecte obj_spinEdit (de tip CEdit) i obj_spin (de tip
CSpinButtonCtrl) sunt variabile membru ale clasei View.
void CP2View::Onci()
{
// TODO: Add your command handler code here
obj_spinEdit.Create(WS_CHILD | WS_VISIBLE | WS_BORDER,
CRect(20, 200, 120, 240), this, IDC_SPINNER);

Programarea n C i C++
obj_spin.Create(WS_CHILD
UDS_SETBUDDYINT

28
| WS_VISIBLE | WS_BORDER |

UDS_ALIGNRIGHT

UDS_ARROWKEYS,

CRect(0, 0, 0, 0), this, 140);


obj_spin.SetBuddy(&obj_spinEdit);
obj_spin.SetRange(1, 100);
obj_spin.SetPos(20);
}
La apelarea funciilor Create() pentru indicatoarele de stil vor trebui specificate
cel puin stilurile WS_CHILD i WS_VISIBLE. n afara stilurilor standard,
controlul de incrementare are urmtoarele stiluri proprii: UDS_ALIGNLEFT Plaseaz

butonul

de

incrementare

stnga

controlului

nsoitor;

UDS_ALIGNRIGHT - Plaseaz butonul de incrementare n dreapta controlului


nsoitor; UDS_ARROWKEYS - Permite controlului s rspund la mesajele
tastelor cu sgeat n sus i n jos de pe tastatur; UDS_AUTOBUDDY Specific automat controlul drept control nsoitor; UDS_HORZ - Orienteaz
sgeile casetei la stnga i la dreapta n loc de n sus i n jos;
UDS_NOTHOUSANDS - mpiedic afiarea separatorilor pentru mii (de
regul, virgul); UDS_SETBUDDYINT - Stabilete textul controlului nsoitor
cnd utilizatorul modific poziia sgeilor de incrementare i UDS_WRAP Creeaz o caset de incrementare care afieaz valorile de la cea mai mare la
cea mai mic i invers;
Valoarea controlului de incrementare va fi afiat dac acesta va fi
asociat cu un control nsoitor (buddy). MFC actualizeaz controlul nsoitor
cnd se modific valoarea din controlul de incrementare. Dup crearea
controlului nsoitor obj_spinEdit (un obiect CEdit), trebuie creat controlul de

29

Programarea n C i C++

incrementare (obj_spin) i s i fie asociat acestuia controlul nsoitor prin


apelarea funciei SetBuddy().
obj_spin.SetBuddy(&obj_spinEdit);
Poziia i mrimea controlului de incrementare sunt selectate toate pe
zero deoarece aceste valori sunt determinate de dimensiunea i poziia
controlului nsoitor.
Ca la butonul glisant, trebuie configurat i n acest caz domeniul i
poziia controlului de incrementare:
obj_spin.SetRange(1, 100);
obj_spin.SetPos(20);

33. Serializarea structurilor de date


ntr-o aplicaie de tip document/view, datele sunt reprezentate printr-un
obiect document, iar vizualizrile acestor date sunt reprezentate printr-unul sau
mai multe obiecte view. Obiectele document i view lucreaz mpreun pentru a
procesa intrrile utilizatorului i pentru a afia datele rezultate. Clasele de baz
pentru acest tip de arhitectur sunt C...Doc i C...View.
Arhitectura document/view separ funciile pentru salvarea sau ncrcarea
datelor de funciile pentru vizualizarea acestora. Clasa C...Doc a aplicaiei
implementeaz funciile corespunztoare serializri datelor n (Save) i dintr-un
(Open) fiier de pe unitatea de memorie. Clasa C...View permite afiarea datelor
i editarea acestora.

Programarea n C i C++

30

Prin serializare structurile de date sunt convertite ntr-un flux liniar de bii,
iar refacerea structurii de date din fluxul de bii se numete deserializare.
Serializarea este folosit pentru stocarea unei structuri de date ntr-o memorie
persistent sau transferul structurii de date prin conexiunile unei reele. Clasa
care suport serializarea, de obicei este derivat din clasa CObject a bibliotecii
de clase MFC. Aceast clas COject conine o funcie virtual Serialize() care
are urmtorul prototip:
virtual void Serialize(CArchive& ar);
Scrierea i citirea de date ntr-un i dintr-un fiier se realizeaz printr-un
obiect care poart numele de arhiv i care este o instan a clasei CArchive.
Fiecare arhiv conine o referin ctre un fiier i pe msur ce datele sunt
incluse n ea, va ataa coninutului fiierului irul de bii corespunztor. ntr-o
aplicaie construit pe baza arhitecturii document/view, clasa document C...Doc
va conine funcia Serialize() care va fi apelat ori de cte ori este necesar
salvarea sau ncrcarea dintr-un fiier (ca rspuns la comenzile Save sau
Open din meniul File). Scrierea codului acestei funcii pentru a realiza
salvarea i ncrcarea datelor coninute n clasa C...Doc depinde doar de
programator, care va trebui s respecte urmtorii pai:
1. Utilizarea AppWizard-ului pentru crearea unui schelet de aplicaie MFC
Single Document;
2. Adugarea variabilelor necesare pentru nregistrarea datelor n clasa C...Doc;
3. Scrierea codului funciei OnNewDocument() a clasei C...Doc pentru
iniializarea unui document nou;
4. Scrierea codului funciei Serialize() a clasei C...Doc pentru a salva i ncrca
datele documentului;

31

Programarea n C i C++

5. Scrierea codului funciei OnDraw() a clasei C...View pentru afiarea


coninutului documentului curent;
6. Clasei C...View i se adaug codul pentru interfaa cu utilizatorul, acesta avnd
astfel posibilitatea s editeze datele documentului curent.
Urmtorul exemplu utilizeaz arhitectura document/view pentru editarea
unui ir de caractere salvarea i ncrcarea n sau dintr-un fiier de pe unitatea
de memorie. Datele aplicaiei P3 sunt reprezentate de un ir de caractere, de tip
CString. Se va aduga o astfel de variabil membru (cu numele stringinout)
clasei document CP3Doc, avnd modificatorul de acces public.

Fig. 33.1
Funcia OnNewDocument() a clasei C...doc se apeleaz cnd este creat
un nou document. n aplicaia P3 funcia OnNewDocument() va iniializa irul
de caractere cu denumirea "new string".
BOOL CP3Doc::OnNewDocument() {

Programarea n C i C++

32

if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
stringinout="new string";
UpdateAllViews(NULL);
return TRUE;
}
Apelul funciei UpdateAllViews() permite actualizarea imaginii afiate.
Funcia Serialize() primete ca parametru un obiect CArchive, care
poate serializa mai multe tipuri de date, inclusiv clase de genul CString. Pentru
salvarea datelor se utilizeaz operatorul << iar pentru a ncrca date se folosete
operatorul >>. Cei doi operatori sunt suprancrcai n clasa CArchive astfel
nct s poat salva i ncrca mai multe tipuri de date.
Apelul funciei UpdateAllViews() dup ncrcarea documentului,
permite actualizarea imaginii afiate.
void CP3Doc :: Serialize(CArchive& ar) {
if (ar.IsStoring()) {
// TODO: add storing code here
ar<<stringinout;
}
else {
// TODO: add loading code here
ar>>stringinout;
UpdateAllViews(NULL);
}

33

Programarea n C i C++

Fig. 33.2
Funcia OnDraw() din clasa C...View afieaz coninutul documentului
curent n cadrul ferestrei aplicaiei. n aplicaia P3, imaginea afiat este
coninutul irului de caractere stringinout.
void CP3View::OnDraw(CDC* pDC) {
CP3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(30, 30, pDoc->stringinout); }
Codul pentru editarea datelor documentului
Modificarea irului de caractere se face prin intermediul unei casete de
dialog. Se adaug aplicaiei o nou resurs de tip CDialog, descris de o clas
cu numele CDialogstring, care are o variabil membru m_string de tip CString.

Programarea n C i C++

34

Funcia mesaj rspuns Onmodifica() deschide cutia de dialog i


recupereaz n variabila stringinout noul ir de caractere dac utilizatorul
nchide cutia folosind butonul OK.
void CP3View::Onmodifica() {
// TODO: Add your command handler code here
CP3Doc* pDoc = GetDocument();
CDialogstring dialog;
int result = dialog.DoModal();
if( result = = IDOK)
pDoc->stringinout=dialog.m_string;
Invalidate();
}
Apelul funciei Invalidate() permite actualizarea imaginii afiate.

Fig. 33.3

35

Programarea n C i C++

Bibliografie
[1]

Bjarne Stroustrup, The C++ Programming Language, Second Edition,


Addison Weslez, 1991

[2]

Valentin Cristea, Cristian Giumale, Eugenia Kalisz, Alexandru Pnoiu,


Limbajul C standard, Edituara Teora, Bucureti 1992

[3]

Liviu Negrescu, Introducere n limbajul C, Editura Microinformatica,


Cluj-Napoca 1993

[4]

Liviu Negrescu, Limbajele C i C++ pentru nceptori, Volumul I,


Limbajul C, Editura Microinformatica, Cluj-Napoca 1994

[5]

Liviu Negrescu, Limbajele C i C++ pentru nceptori, Volumul II,


Limbajul C++, Editura Microinformatica, Cluj-Napoca 1994

[6]

Ionu Mulea, C++ pentru avansai, Editura Microinformatica, ClujNapoca 1994

[7]

Dorin Mircea Popovici, Ioan Mircea Popovici, Iustin Tnase, Tehnologia


orientat pe obiecte. Aplicaii, Edituara Teora, Bucureti 1996

[8]

I. Smeureanu, I. Ivan, M. Drdal, Limbajul C/C++, Editura Cison,


Bucureti 1995

[9]

D. Somnea, D. Turturea, Iniiere n C++, Editura Tehnic, Bucureti 1993

[10] Namir C. Shammas, Curs rapid de Borland C++ 4, Edituara Teora,


Bucureti 1996
[11] Nabajyoti Barkakati, Borland C++ 4 Ghidul programatorului, Edituara
Teora, Bucureti 1996
[12]

Kris Jamsa, Lars Klander, Totul despre C si C++. Manual fundamental

de programare in C si C++, Editura Teora, 2001


[13]
1999

Clayton Wanum, Secrete Programare in Windows 98, Editura Teora,

Programarea n C i C++
[14]

36

Koller E., Rocule M. E., Visual C++. Programarea aplicaiilor

Windows cu MFC, Editura Teora, Bucureti, 1998


[15]

Mircea Curila, Curs de Limbaje de Programare, Universitatea din

Oradea, 2009
[16]

Sorin Curila, Curs de Programare Orientata pe Obiecte, Universitatea

din Oradea, 2009

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