Documente Academic
Documente Profesional
Documente Cultură
Pentru fiecare box de dialog care apare pe ecran exist dou entiti pe care trebuie s le dezvoltm: o resurs box
de dialog i o clas box de dialog.
Resursa box de dialog este folosit pentru a desena boxa de dialog i controalele pe care le conine.
Clasa menine valorile din boxa de dialog i exist o funcie membru a acestei clase care este folosit pentru a activa
boxa de dialog. n general se construiete un meniu ce va conine o opiune pentru activarea acestui dialog.
Resursa box de dialog se construiete cu editorul de resurse. Pe baza acestei resurse Class Wizard va genera clasa
corespunztoare. n general boxele de dialog sunt derivate din CDialog.
Trebuie s tim c ntre boxa de dialog afiat pe ecran i variabilele care menin starea anumitor controale este
definit un schimb bidirecional de date. Un rol important l joac aici funcia UpdateData() care stabilete
practic direcia de schimb ecran->variabile sau variabile->ecran.
Funciile care ncep cu DDX_ realizeaz schimbul de date. Exist 34 de funcii care ncep cu DDX, una pentru
fiecare tip de dat care poate fi schimbat ntre clas i dialog. Primul parametru arat direcia, al doilea este ID-ul
controlului iar al treilea parametru este numele variabilei. Codul este adgat de Class Wizard.
OBSERVAIE: Anumite funcii DDX nu sunt generate de Class Wizard. De exemplu,
cnd ne conectm la o valoare din List Box, singura alegere posibil pentru tip este
CString. Alegnd acest lucru, Class Wizard va genera un apel la DDX_LBString() care
conecteaz stringul selectat la variabila membru de tip CString. Exist situaii cnd un
index de tip int este mai bun. Pentru acest lucru exist funcia DDX_LBIndex() care
realizez acest schimb de informaii. O parte dintre funciile din List Box folosesc indeci
pentru a manevra articolele dintr-un list box. Putem aduga cod n DodataExchange(), dar
n afara comentariilor speciale introduse de Class Wizard. n acest caz vom aduga
singuri variabila membru la clas.
Funciile care ncep cu DDV realizeaz validarea datelor. Prametrul al doilea este numele variabilei, iar al treilea
specific limitele.
Cade n sarcina noastr s includem acest mesaj n tratare (se face cu Class Wizard). Se va explica n mod concret
cum se folosete Class Wizard pentru a aduga noi mesaje tratate de clasa respectiv. De asemenea tot cu Class
Wizard se ataeaz variabile pentru controalele dintr-o box de dialog.
Un exemplu pentru OnInitDialog()
BOOL CSdiDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_listbox.AddString("First String");
m_listbox.AddString("Second String");
m_listbox.AddString("Yet Another String");
m_listbox.AddString("String Number Four");
m_listbox.SetCurSel(2);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Aceast funcie apeleaz mai nti OnInitDialog() din clasa de baz, iar n continuare se execut codul din cadrul
funciei. Stringurile vor fi afiate n ordinea n care au fost introduse (adugate) cu funcia AddString().
n final se apeleaz funcia SetCurSel(), funcie care are drept parametru un index ce identific articolele din List
Box. Indexul pentru primul articol are valoarea 0 (zero).
OBSERVAIE: n mod obinuit, articolele n list box sunt adugate dintr-un vector sau
o list. Pentru acest lucru se folosesc clasele colecie din MFC (CStringArray, CList,
etc.).
Pentru a menine (memora) articolul (string-ul) selectat n list box, vom aduga o variabil membru de tip CString la
aceast clas. Aceast variabil va fi privat, i deci vom aduga funcii membru publice la clas pentru a manevra
aceast variabil pentru a pstra stilul de programare impus de POO.
Pentru selecie se va trata mesajul de notificare BN_CLICKED, care are semnificaia c utilizatorul a fcut o selecie
n list box. Funcia care trateaz acest mesaj se va aduga tot cu Class Wizard. n codul care urmeaz se exemplific
preluarea stringului din list box la apsarea butonului OK.
void CSdiDialog::OnOK()
{
int index = m_listbox.GetCurSel();
if (index != LB_ERR)
{
m_listbox.GetText(index, m_selected);
}
else
{
m_selected = "";
}
CDialog::OnOK();
}
Explicaii. Funcia GetCurSel() ntoarce indexul la articolul selectat. Dac acesta este valid (index != LB_ERR) se
obine valoarea acestui articol n variabila m_selected care este de tip CString folosind funcia GetText al crei prim
parametru este indexul articolului.. n final se apeleaz funcia OnOK() din clasa de baz pentru a executa alte
procesri necesare. n cele ce urmeaz vom observa apeluri la funciile din clasa de baz. Aceste apeluri sunt
generate de Class Wizard. Exist i excepii cnd aceste apeluri trebuiesc invalidae (comentate). Ca un exemplu vom
vedea la mprtirea zonei client n mai multe ferestre (splitting window) la apelul funciei OnCreateClient().
m_radio = 1;
UpdateData(FALSE);
Variabila m_radio este ataat unui grup de butoane radio i reprezint indexul butonului n acest grup. Primul buton
are indexul 0 (zero). Funcia UpdateData(FALSE) stabilete direcia de actualizare, care n acest caz este de la
variabil la ecran i n final are loc un refresh al boxei de dialog.
Un grup de butoane radio poate fi accesat dup ce boxa de dialog nu mai este pe ecran, deci nu trebuie s tratm
OnOK() sau ONCancel().