Sunteți pe pagina 1din 15

Controale clasice

W pune la dispozitie 6 (sase) controale clasice. Un control nu este altceva decit o fereastra cu stiluri speciale.
Trebuie retinut faptul ca a lucra cu un asemea control este ca si cum am lucra cu o fereastra. Tipurile controalelor,
structurile WNDCLASS si clasele corespondente MFC sunt date in tabela urmatoare:

Controale clasice

Control Type WNDCLASS MFC Class


Buttons "BUTTON" CButton
List boxes "LISTBOX" CListBox
Edit controls "EDIT" CEdit
Combo boxes "COMBOBOX" CComboBox
Scroll bars "SCROLLBAR" CScrollBar
Static controls "STATIC" CStatic

Un control este creat prin instantierea clasei respective din MFC urmat apoi de apelul functiei Create din acea clasa.
MFC creaza un obiect in doi pasi. De descris avantajele si dezavantajele acestei metode.
Daca m_wndPushButton este un obiect CButton, instructiunea:

m_wndPushButton.Create (_T ("Start"), WS_CHILD WS_VISIBLE


BS_PUSHBUTTON, rect, this, IDC_BUTTON);

creaza un control push button ce contine textul Start.


Descriere parametrii pt. fct. Create:
primul parametru specifica textul controlului;
al doilea param. reprezinta stilul ferestrei, ce reprezinta o combinatie intre stilurile ferestrei si stiluri specifice
controlului.; Controlul creat este o fereastra descendent (copil) al ferestrei identificata de al patrulea parametru (in
SDK se furnizeaza un HWND la fereastra parinte);
al treilea parametru specifica marimea si pozitia (in pixeli) controlului, data printr-un obiect CRect; pozitia este
relativa la coltul din stg sus al ferestrei parinte;
ultimul parametru este ID-ul butonului (controlului - un intreg), folosit in diverse functii pentru a avea access la el;
acest ID trebuie sa aiba o valoare unica in interiorul ferestrei date pentru a putea identifica corect controlul si
functiile care trateaza mesajele de notificare.

Unele controale (ListBox, Edit) pentru a se alinia la noile stiluri, au o noua functie membru CreateEx. Stilurile
extinse se scriu numai in cadrul acestei functii (vezi CreateWindow si CreateWindowEx).

Daca m_wndListBox este un obiect CListBox, urmatoarea instructiune creaza un control list box cu stilulu extins
WS_EX_CLIENTEDGE:

m_wndListBox.CreateEx (WS_EX_CLIENTEDGE, _T ("LISTBOX"), NULL,


WS_CHILD | WS_VISIBLE | LBS_STANDARD, rect, this, IDC_LISTBOX);

Ca o alternativa, putem deriva clasa noastra din CListBox, si apoi rescriem functia PreCreateWindow in clasa
derivata, si aplicam stilul de fereastra WS_EX_CLIENTEDGE:

BOOL CMyListBox::PreCreateWindow (CREATESTRUCT& cs)


{
if (!CListBox::PreCreateWindow (cs))
return FALSE;

cs.dwExStyle |= WS_EX_CLIENTEDGE;

return TRUE;
}
Un control trimite notificari parintelui sub forma de mesaje WM_COMMAND. Tipurile de notificari depind de
tipul controlului, dar in fiecare caz, informatia din parametrii mesajului, wParam si lParam, identifica controlul care
trimite mesajul si actiunea ceruta de mesaj.
De exemplu, cind un push button este apasat (clic), codul de notificare este BN_CLICKED in HIWORD(wParam) si
ID-ul controlului in LOWORD(wParam), iar handler-ul ferestrei controlului in lParam.
Cadrul de lucru MFC, insereaza in harta de mesaje acest mesaj de notificare, ascunzind detaliile de implementare
pentru tratarea mesajului WM_COMMAND (se face legatura intre ID-ul controlului si functia care trateaza mesajul
de notificare):

ON_BN_CLICKED (IDC_BUTTON, OnButtonClicked)

ON_BN_CLICKED este un macrou, si asemenea macro-uri exista pentru fiecare mesaj de notificare de la fiecare
control.
Exista un macro generic ON_CONTROL, care manipuleaza toate notificarile si toate tipurile de controale, si
ON_CONTROL_RANGE, care mapeaza notificari in mod identic de la doua sau mai multe controale la o functie
comuna. Comunicarea intre controale si parinti (proprietarii controlului) este in ambele directii. De ex. parintele
poate trimite mesajul BM_SETCHECK unui control check box cu parametrul wParam BST_CHECKED.

MFC simplifica interfata controlului bazata pe mesaje prin construirea de functii membru in clasa controlului care
wrap BM_SETCHECK si alte mesaje ale controlului. De exemplu:

m_wndCheckBox.SetCheck (BST_CHECKED);

plaseaza un check mark in interiorul check box-ului reprezentat de un obiect CButton, numit m_wndCheckBox.
Din cauza ca un control este o fereastra, anumite functii membru pe care controlul le mosteneste din CWnd sunt
folositoare pentru controlul programarii.
De exemplu aceeasi functie care modifica titlul unei ferestre, SetWindowText, modifica textul (eticheta) unui push
button, sau schimba continutul unui control de editare (box edit). Alte functii: GetWindowText, EnableWindow,
SetFont. Daca vrem sa facem ceva in control si nu gasim o functie corespunzatoare in clasa controlului va trebui sa
cautam o asemenea functie in clasa CWnd din care sunt derivate toate contraolele.

Clasa CButton
CButton reprezinta controale de tip button bazate pe clasa WNDCLASS "BUTTON". Controalele button exista in
patru variante: push buttons, check boxes, radio buttons, si group boxes. Se vor desena cele patru tipuri.

Cand cream un control buton, vom specifica tipul acestuia prin includerea unuia din urmatoarele flag-uri in stilul
ferestrei butonului:

Style Description
BS_PUSHBUTTON Creates a standard push button control
BS_DEFPUSHBUTTON Creates a default push button; used in dialog boxes to identify the push
button that's clicked if Enter is pressed
BS_CHECKBOX Creates a check box control
BS_AUTOCHECKBOX Creates a check box control that checks and unchecks itself when clicked
BS_3STATE Creates a three-state check box control
BS_AUTO3STATE Creates a three-state check box control that cycles through three states
checked, unchecked, and indeterminatewhen clicked
BS_RADIOBUTTON Creates a radio button control
BS_AUTORADIOBUTTON Creates a radio button control that, when clicked, checks itself and
unchecks other radio buttons in the group
BS_GROUPBOX Creates a group box control

In plus, putem adauga urmatoarele valori (OR pe biti) la stilul ferestrei controlului privitoare la linierea textului ce
insoteste controlul:

Style Description
BS_LEFTTEXT Moves the text accompanying a radio button or check box control from the
button's right (the default) to its left
BS_RIGHTBUTTON Same as BS_LEFTTEXT
BS_LEFT Left justifies the button text in the control rectangle
BS_CENTER Centers the button text in the control rectangle
BS_RIGHT Right justifies the button text in the control rectangle
BS_TOP Positions the button text at the top of the control rectangle
BS_VCENTER Positions the button text in the center of the control rectangle vertically
BS_BOTTOM Positions the button text at the bottom of the control rectangle
BS_MULTILINE Allows text too long to fit on one line to be broken into two or more lines

Exista si alte tipuri de stiluri de butoane, dar care sunt folosite mai putin. De ex., BS_NOTIFY, programeaza un
buton sa trimita notificarile BN_DOUBLECLICKED, BN_KILLFOCUS, si BN_SETFOCUS.
BS_OWNERDRAW creaza un buton owner-draw (desenat de proprietar programatorul va scrie cod pentru acest
lucru) infatisarea (aparenta) butonului este gestionata de parintele butonului.

Butoane Push
Un push button este un control buton creat cu stilul BS_PUSHBUTTON. Cind este apasat, controlul trimite
parintelui notificarea BN_CLICKED printr-un mesaj WM_COMMAND. In absenta stilului BS_NOTIFY, un
asemenea control nu trimite nici un alt tip de notificare.
Macroul ON_BN_CLICKED din MFC leaga notificarile BN_CLICKED de functia membru din clasa fereastra
parinte:
ON_BN_CLICKED(IDC_BUTTON, OnButtonClicked)

Functiile pentru BN_CLICKED nu au parametri si nu intorc valori.

Check Boxes

Check boxes sunt butoane create cu stilul BS_CHECKBOX, BS_AUTOCHECKBOX, BS_3STATE, sau
BS_AUTO3STATE. Stilurile BS_CHECKBOX si BS_AUTOCHECKBOX pot presupune doua stari: checked si
unchecked. Un check box trece in starea checked sau unchecked cu CButton::SetCheck:

m_wndCheckBox.SetCheck (BST_CHECKED); // Check


m_wndCheckBox.SetCheck (BST_UNCHECKED); // Uncheck

Pentru a determina daca un check box este in starea checked, folosim CButton::GetCheck. O valoare de retur egala
cu BST_CHECKED inseamna ca chcek box-ul este in starea checked, iar BST_UNCHECKED este pt unchecked.
Check boxes trimit notificarile BN_CLICKED parintilor lor cind facem click in zona lor. Stilul
BS_AUTOCHECKBOX face ca acest control sa lucreze ca un switch on/off automatizat in raspuns la even. click
mouse. Stilul BS_CHECKBOX nu face acelasi lucru. Un exemplu de cod pentru un check box cu stilul
BS_CHECKBOX si ce trebuie sa facem la BN_CLICKED:

void CMainWindow::OnCheckBoxClicked ()
{
m_wndCheckBox.SetCheck (m_wndCheckBox.GetCheck () ==
BST_CHECKED ? BST_UNCHECKED : BST_CHECKED);
}

Stilurile BS_3STATE si BS_AUTO3STATE creaza un check box care presupune o a treia stare numita
nedeterminata (indeterminate), si controlul intra in aceasta stare cind facem clic pe un asemenea buton iar starea lui
curenta este checked sau cind apelam SetCheck cu parametrul BST_INDETERMINATE:

m_wndCheckBox.SetCheck (BST_INDETERMINATE);

Un check box in starea indeterminate contine a grayed check mark. Aici pare sa lucreze o logica trivalenta
partiala, in sensul ca starea nu poate fi sigura nici checked nici unchecked. (Ex. selectam text in bold si nebold.)
Butoane Radio

Un buton radio este un control de tip buton cu stilul BS_RADIOBUTTON sau BS_AUTORADIOBUTTON. In mod
normal butoanele radio lucreaza in grup, si reprezinta o lista de optiuni mutual exclusive. Cind selectam un buton
radio cu stilul BS_AUTORADIOBUTTON va ramine activ numai butonul selectat, celelalte butoane din grup
devenind inactive in mod automat. Daca folosim stilul BS_RADIOBUTTON, va trebui sa scriem noi cod pentru a
dezactiva celelalte butoane, folosind functia CButton::SetCheck.
Butoanele radio trimit notificarile BN_CLICKED parintilor lor, la fel ca mai sus.
Urmatorul cod trateaza BN_CLICKED:

void CMainWindow::OnRadioButton1Clicked ()
{
m_wndRadioButton1.SetCheck (BST_CHECKED);
m_wndRadioButton2.SetCheck (BST_UNCHECKED);
m_wndRadioButton3.SetCheck (BST_UNCHECKED);
m_wndRadioButton4.SetCheck (BST_UNCHECKED);
}

Deselectind (unchecking) celelalte butoane radio mentine exclusivitatea selectiei. Un handler (o fct.) pentru
BN_CLICKED nu este necesar pentru butoanele cu stilul BS_AUTORADIOBUTTON. Pentru butoane radio cu
stilul BS_AUTORADIOBUTTON pentru a deselecta corect alte butoane din grup, trebuie sa grupam butoanele in
momentul crearii, a.i. W sa stie care butoane apartin grupului. Pentru a crea un grup d ebutoane radio cu stilul
BS_AUTORADIOBUTTON urmam urmatoarea procedura (tehnica):
1. In codul aplicatiei, cream butoanele unul dupa altul fara a intercala intre acestea alte controale de alt tip.
2. Pentru a marca inceputul grupului, atribuim stilul WS_GROUP primului buton radio pe care il cream.
3. Daca cream controale aditionale dupa ultimul buton radio din grup, atribuim stilul WS_GROUP primului
control aditional pe care il cream.

Cream doua grupuri de cite 4 respectiv 3 butoane radio cu stilul BS_AUTORADIOBUTTON cu un control check
box intre ele:

m_wndRadioButton1.Create (_T ("COM1"), WS_CHILD WS_VISIBLE


WS_GROUP BS_AUTORADIOBUTTON, rect1, this, IDC_COM1);
m_wndRadioButton2.Create (_T ("COM2"), WS_CHILD WS_VISIBLE
BS_AUTORADIOBUTTON, rect2, this, IDC_COM2);
m_wndRadioButton3.Create (_T ("COM3"), WS_CHILD WS_VISIBLE
BS_AUTORADIOBUTTON, rect3, this, IDC_COM3);
m_wndRadioButton4.Create (_T ("COM4"), WS_CHILD WS_VISIBLE
BS_AUTORADIOBUTTON, rect4, this, IDC_COM4);
m_wndRadioButton1.SetCheck (BST_CHECKED);

m_wndCheckBox.Create (_T ("Save settings on exit"),


WS_CHILD WS_VISIBLE WS_GROUP BS_AUTOCHECKBOX,
rectCheckBox, this, IDC_SAVESETTINGS);

m_wndRadioButton5.Create (_T ("9600"), WS_CHILD WS_VISIBLE


WS_GROUP BS_AUTORADIOBUTTON, rect5, this, IDC_9600);
m_wndRadioButton6.Create (_T ("14400"), WS_CHILD WS_VISIBLE
BS_AUTORADIOBUTTON, rect6, this, IDC_14400);
m_wndRadioButton7.Create (_T ("28800"), WS_CHILD WS_VISIBLE
BS_AUTORADIOBUTTON, rect7, this, IDC_28800);
m_wndRadioButton5.SetCheck (BST_CHECKED);

Butoanele radio nu sunt niciodata checked implicit. Este responsabilitatea programatorului.


Group Boxes

Un control group box este creat cu stilul BS_GROUPBOX. Acest control nu primeste si nici nu trimite mesaje.
Singurul rol al lor este de a grupa anumite controale in interfata destinata utilizatorului.

Clasa CListBox
Clasa CListBox din MFC incapsuleaza controalele list box, care afiseaza o lista de stringuri numite articole. Un list
box optional poate sorta articolele pe care le contine si are implementata navigarea verticala, optional si cea
orizontala.
Cind pe un item (articol) facem clic sau dublu clic , list box-urile (care au stilul LBS_NOTIFY) notifica parintilor
lor printr-un mesaj WM_COMMAND. MFC simplifica procesarea acestor mesaje furnizind macro-ul ON_LBN in
harta de mesaje, care ruteaza notificarile list box-ului la functii din clasa fereastra parinte..
Un list box standard afiseaza stringuri intr-o coloana verticala si permite ca un singur articol sa fie selectat la un
moment dat. Articolul curent selectat este afisat in video invers cu culoarea sistem COLOR_HIGHLIGHT. Windows
suporta un numar de variatii de la standardul initial, variatii ce permit selectii multiple, afisarea pe mai multe
coloane, list box-uri desenate de proprietar, afisare de imagini in locul textului.

Crearea unui List Box

Urmatoarea instructiune creaza un list box din obiectul CListBox numit m_wndListBox:

m_wndListBox.Create (WS_CHILD WS_VISIBLE LBS_STANDARD,


rect, this, IDC_LISTBOX);

LBS_STANDARD combina the stilurile WS_BORDER, WS_VSCROLL, LBS_NOTIFY, si LBS_SORT pentru a


crea un list box care are margini, o bara de scroll verticala, care notifica parintilor sai cind selectia s-a schimbat sau
s-a facut dublu clic pe un articol, si ca articolele vor fi sortate in ordine alfabetica. Implicit bara de scroll este
vizibila numai cind articolele nu pot fi afisate in intregime in fereastra controlului. Pentru a face ca bara de scroll sa
fie afisata tot timpul va trebui sa includem stilul LBS_DISABLENOSCROLL. A list box doesn't have a vertical
scroll bar unless the style WS_VSCROLL or LBS_STANDARD is included. Putem crea list box-uri care cuprind
toata zona client. List box-urile au incapsulata interfata cu tastatura (tastele sageti, page up, down, apasarea unui
caracter muta selectia pe articolul care incepe cu acel caracter. Apasarea barei de spatiu face sa avem selectie
multipla sau nu (on/off).
Putem programa interfata cu tastatura prin includerea stilului LBS_WANTKEYBOARDINPUT si procesarea
mesajelor WM_VKEYTOITEM si WM_CHARTOITEM. O aplicatie MFC poate mapa aceste mesaje cu fct.
OnVKeyToItem si OnCharToItem folosind macro-urile ON_WM_VKEYTOITEM si ON_WM_CHARTOITEM. O
clasa list box derivata poate manipula aceste mesaje singura prin suprascrierea functiilor virtuale
CListBox::VKeyToItem si CListBox::CharToItem. O utilizarae a acestei proprietati este de a crea clase list box-uri
self-contained list box class , care raspund la Ctrl-D prin stergerea articolului curent selectat.

List Box Styles


Style Description
LBS_STANDARD Creates a "standard" list box that has a border and a vertical scroll bar,
notifies its parent window when the selection changes or an item is
double-clicked, and sorts items alphabetically.
LBS_SORT Sorts items that are added to the list box.
LBS_NOSEL Creates a list box whose items can be viewed but not selected.
LBS_NOTIFY Creates a list box that notifies its parent when the selection changes or
an item is double-clicked.
LBS_DISABLENOSC ROLL Disables the list box's scroll bar when it isn't needed. Without this style,
an unneeded scroll bar is hidden rather than disabled.
LBS_MULTIPLESEL Creates a multiple-selection list box.
LBS_EXTENDEDSEL Adds extended selection support to a multiple-selection list box.
LBS_MULTICOLUMN Creates a multicolumn list box.
LBS_OWNERDRAWVARIABLE Creates an owner-draw list box whose items can vary in height.
LBS_OWNERDRAWFIXED Creates an owner-draw list box whose items are the same height.
LBS_USETABSTOPS Configures the list box to expand tab characters in item text.
LBS_NOREDRAW Creates a list box that doesn't automatically redraw itself when an item
is added or removed.
LBS_HASSTRINGS Creates a list box that "remembers" the strings added to it.
Conventional list boxes have this style by default; owner-draw list
boxes don't.
LBS_WANTKEYBOARDINPUT Creates a list box that sends its parent a WM_VKEYTOITEM or
WM_CHARTOITEM message when a key is pressed. This style is used
to customize the list box's response to keyboard input.
LBS_NOINTEGRALHEIGHT Allows a list box to assume any height. By default, Windows sets a list
box's height to a multiple of the item height to prevent items from being
partially clipped.

Pentru ca fontul implicit pe care W il foloseste pt list box-uri este proportional spatiat, virtual este imposibil de a
alinia coloanele prin spatii. O modalitate de a crea liste ce contin informatii pe mai multe coloane este sa folosim
SetFont pt a aplica un font fixed-pitch la un list box. O solutie mai buna este de a asigna list box0urilor stilul
LBS_USETABSTOPS si de a separa coloanele de informatii cu tab. Un list box cu stilul LBS_USETABSTOPS
trateaza caracterele tab ca un procesor de texte. Implicit tab este de marimea a 8 caractere pentru latime. Putem
schimba acest lucru cu fct. CListBox::SetTabStops. SetTabStops masoara distanta in unitati de dialog = o patrime din
latimea unui caracter in fontul sistem.
Instructiunea:

m_wndListBox.SetTabStops (64);

pune spatiul dintre tab-uri la 64 unitati de dialog , and

int nTabStops[] = { 32, 48, 64, 128 };


m_wndListBox.SetTabStops (4, nTabStops);

plaseaza stop tab-uri la 32, 48, 64, si 128 unitati de dialog fata de marginea din stinga.
Implicit un list box se redeseneaza singur cind este adaugat/sters un articol. Pentru a impiedica acest lucru putem
seta stilul LBS_NOREDRAW. O asemenea lista va fi redesenata cind zona ei client va fi invalidata.
O alta alternativa este de a inhiba procesul de actualizare cu LBS_NOREDRAW si a-l reactiva dupa ce ultimul
articol din list box a fost adaugat. Putem face redesenarea enable/disable prin trimiterea mesajului si nu mai este
necesar Invalidate()

m_wndListBox.SendMessage (WM_SETREDRAW, FALSE, 0); // Disable redraws.


m_wndListBox.SendMessage (WM_SETREDRAW, TRUE, 0); // Enable redraws.

Stilul LBS_MULTIPLESEL este folosit pentru selectii multiple. Cele mai multe list box-uri sunt create cu stilul
LBS_EXTENDEDSEL, care permite selectii extinse. Cu un asemenea stil se fac selectii cu ajutorul mouse-ului si a
tastei Ctrl (pe sarite) sau Shift (selectie contigua) (se poate combina Ctrl si Shift).
Stilul LBS_MULTICOLUMN creaza un list box cu mai multe coloane (implicit 16 car per art.), care in mod normal
au si stilul WS_HSCROLL pentru defilare orizontala. List Box-urile multicoloana nu pot avea bara verticala pentru
scroll. Latimea coloanei se ajusteaza cu functia CListBox::SetColumnWidth.

Adaugarea si Stergerea articolelor

Articolele sunt adaugate cu fct. CListBox::AddString si CListBox::InsertString. Instructiunea:

m_wndListBox.AddString (string);

adauga un ob. CString la list box. Daca stilul include LBS_SORT, at. art. e pozitionat corespunzator ordinii de
sortare alfabetice, altfel este adaugat la sfirsitul listei. InsertString adauga art. la o pozitie indicata de primul
parametru al fct. (zero-based index):

m_wndListBox.InsertString (3, string);

LBS_SORT nu are efect asupra stringurilor adaugate cu InsertString.


Ambele functii AddString si InsertString intorc pozitia stringului din list box. In caz de esec se returneaza
LB_ERRSPACE pentru a indica ca un list box este plin sau LB_ERR pt. a indica ca s-a intimplat altceva din diverse
motive. Capacitatea unui list box este limitata numai de memoria disponibila. Functia CListBox::GetCount
returneaza numarul art. dintr-un list box.
Fct. CListBox::DeleteString elimina un articol dintr-un list box, articol identificat prin indexul sau. Intoarce numarul
articolelor ramase in list box. Pentru a sterge toate art. fol. fct. CListBox::ResetContent.

Daca dorim sa asociem un pointer pe 32 biti sau o valoare DWORD cu un articol din list box putem folosi fct.
CListBox::SetItemDataPtr sau CListBox::SetItemData. Un pointer sau un DWORD asociat cu un art. poate fi regasit
cu fct. CListBox::GetItemDataPtr sau CListBox::GetItemData. O folosire a acestei trasaturi este de ex. de a asocia o
structura de date ce contine nr. de telefon pentru persoanele dintr-un list box. Din cauza ca GetItemDataPtr
intoarce un pointer la void trebuie facuta conversia.
O alta tehnica este de a asocia extra date in particular text cu art. dintr-un list box , s acream un list box cu stilul
LBS_USETABSTOPS, sa setam primul tab stop la o pozitie din afara marginii drepte a list box-ului si din a adauga
stringuri ce contin car tab urmate de extra data (text). Textul de la dreapta tab-ului va fi invizibil, dar
CListBox::GetText va returna intregul text, deci si cel extra.

Cautarea si regasirea articolelor

CListBox::GetCurSel intoarce indexul (0-based) al articolului care este selectat. Daca valoarea returnata este
LB_ERR inseamna ca nu s-a selectat nimic. GetCurSel este adesea apelata ca urmare a unei notificari ce semnifica
ca selectia s-a schimbat sau a fost facut dublu clic pe un articol. Un program poate seta selectia curenta cu
SetCurSel. Pasind valoarea 1 pt. SetCurSel vom deselecta toate articolele. Pentru a gasi daca un art particular este
selectat folosim CListBox::GetSel.
SetCurSel identifica un articol prin indexul sau, dar art. pot fi selectate si dupa continut cu fct.
CListBox::SelectString care realizeaza o singura selectie pentru un articol ce incepe cu textul specificat si selecteaza
art. daca se gaseste unul care satisface conditia. Instructiunea

m_wndListBox.SelectString (-1, _T ("Times"));

incepe cautarea cu primul art din list box si va selecta primul art care incepe cu Times. Cautarea nu este case
senzitive. Primul parametru indica indexul de unde incepe cautarea; -1 inseamna de la inceput. Indiferent de unde
incepe cautarea aceasta poate sa parcurga circular intreaga lista asociata list box-ului daca este necesar. Pentru a
cauta pentru un art. particular fara a schimba selectia vom folosi CListBox::FindString sau
CListBox::FindStringExact. FindString face cautare numai pe primele caractere din art. Daca se intoarce LB_ERR
inseamna ca nu s-a gasit acel art, altfel se intoarce indexul art. FindStringExact adauga in plus cautarea exacta. Cu
indexul obtinut anterior putem aobtine textul art. cu CListBox::GetText. Se copie textul art. in var. string.

CString string;
int nIndex = m_wndListBox.GetCurSel ();
if (nIndex != LB_ERR)
m_wndListBox.GetText (nIndex, string);

Al doilea parametru este un pointer la char. Putem folosi CListBox::GetTextLen pentru a determina marimea zonei
necesare pentru a primi textul art. inainte de a apela GetText.
Selectiile multiple sunt tratate diferit. GetCurSel, SetCurSel, si SelectString nu pot fi folosite in acest caz. Art. sunt
selectate (deselectate) cu fct. SetSel si SelItemRange. In continuare se selecteaza art. cu indecsii 0, 5, 6, 7, 8, si 9 si
deselecteaza art. 3:

m_wndListBox.SetSel (0);
m_wndListBox.SelItemRange (TRUE, 5, 9);
m_wndListBox.SetSel (3, FALSE);

Alte functii: GetSelCount pt. determinarea nr. art. selectate, GetSelItems pentru regasirea indecsilor art. selectate.
Intr-un list box cu selectie multipla, dreptunghiul ce reprezinta art. cu focus-ul asupra lui, poate fi mutat fara a
schimba selectia curenta. Dreptunghiul care are focusul poate fi mutat sau obtinut cu fct. SetCaretIndex si
GetCaretIndex. Multe din fct. ce lucreaza cu o singura selectie sunt disponibile si pentru list box-urile cu sele.
multipla: GetText, GetTextLength, FindString, si FindStringExact.

Notificarile List Box

Notificarile sunt trimise via mesajul WM_COMMAND. In app. MFC, notificarile list box-urilor sunt mapate la
functiile din clasa cu macro-ul ON_LBN.Vezi tabelul de mai jos.
Notificrile LBN_DBLCLK, LBN_SELCHANGE, si LBN_SELCANCEL sunt trimise numai daca list box-ul a fost
creat cu stilul LBS_NOTIFY sau LBS_STANDARD.

List Box Notifications


Notification Sent When Message-Map Macro LBS_NOTIFY
Required?
LBN_SETFOCUS The list box gains the input focus. ON_LBN_SETFOCUS No
LBN_KILLFOCUS The list box loses the input focus. ON_LBN_KILLFOCUS No
LBN_ERRSPACE An operation failed because of ON_LBN_ERRSPACE No
insufficient memory.
LBN_DBLCLK An item is double-clicked. ON_LBN_DBLCLK Yes
LBN_SELCHANGE The selection changes. ON_LBN_SELCHANGE Yes
LBN_SELCANCEL The selection is canceled. ON_LBN_SELCANCEL Yes

Notificarile cele mai folosite sunt: LBN_DBLCLK si LBN_SELCHANGE. Pentru a determina indexul articolului
pe care s-a facut dublu clic intr-un list box cu o singura selectie folosim CListBox::GetCurSel. Vezi ex.

// In CMainWindow's message map


ON_LBN_DBLCLK (IDC_LISTBOX, OnItemDoubleClicked)

void CMainWindow::OnItemDoubleClicked ()
{
CString string;
int nIndex = m_wndListBox.GetCurSel ();
m_wndListBox.GetText (nIndex, string);
MessageBox (string);
}

Pentru un LB cu selectie multipla folosim GetCaretIndex in locul fct. GetCurSel pentru a determina articolul pe
care s-a facut dublu clic. Notificarea LBN_SELCHANGE este trimisa cind utilizatorul schimba selectia, dar nu si in
cazul cind selectia este schimbata automat prin program. Un LB cu selectie simpla trimite notificarea
LBN_SELCHANGE cind selectia se muta din cauza unui clic sau a apasarii unei taste. Intr-un LB cu sel. multipla
notificarea LBN_SELCHANGE este trimisa cind se face clic pe un art., cind starea selectiei art. este modificata
(on/off) si cind dreptunghiul care are focus-ul este mutat.

Clasa CStatic
CStatic, reprez. un control static creat din "STATIC" WNDCLASS.
Exista trei tipuri de CS: text (folosit pentru a eticheta alte controale), dreptunghiuri si imagini.

m_wndStatic.Create (_T ("Name"), WS_CHILD WS_VISIBLE SS_LEFT,


rect, this, IDC_STATIC);

SS_LEFT = aliniaza text in stinga. Daca textul nu incape se continua pe linia urmatoare. Pt. a preveni trecerea
textului pe linia urm. putem folosi stilul SS_LEFTNOWORDWRAP in locul lui SS_LEFT. Alte stiluri:
SS_CENTER sau SS_RIGHT. Stilul SS_SIMPLE este asemanator cu SS_LEFT dar creaza un control al carui text
poate fi modificat cu CWnd::SetWindowText.
Pt. a centra vertical textul facem OR pe flagul SS_CENTERIMAGE. (SS_SUNKEN pentru desenare)
CS pt. desenat dreptughiuri. Stilul poate fi ales din urmatoarele:

Style Description
SS_BLACKFRAME Hollow rectangle painted in the system color COLOR_WINDOWFRAME
(default = black)
SS_BLACKRECT Solid rectangle painted in the system color COLOR_WINDOWFRAME (default
= black)
SS_ETCHEDFRAME Hollow rectangle with etched borders
SS_ETCHEDHORZ Hollow rectangle with etched top and bottom borders
SS_ETCHEDVERT Hollow rectangle with etched left and right borders
SS_GRAYFRAME Hollow rectangle painted in the system color COLOR_BACKGROUND (default
= gray)
SS_GRAYRECT Solid rectangle painted in the system color COLOR_BACKGROUND (default =
gray)
SS_WHITEFRAME Hollow rectangle painted in the system color COLOR_WINDOW (default =
white)
SS_WHITERECT Solid rectangle painted in the system color COLOR_WINDOW (default = white)

Instructiunea:

m_wndStatic.Create (_T (""), WS_CHILD WS_VISIBLE SS_ETCHEDFRAME,


rect, this, IDC_STATIC);

creaza un CS asemanator cu grup box.


Un CS dreptunghi nu afiseaza text.
CS pt. imagini formate din bitmap-uri, icoane, cursoare sau metafisiere GDI. Stilurile folosie in acest caz sunt:

Style Description
SS_BITMAP A static control that displays a bitmap
SS_ENHMETAFILE A static control that displays a metafile
SS_ICON A static control that displays an icon or a cursor

Dupa ce se creaza un control static imagine, asociem bitmap, icoana sau cursor cu fct. SetBitmap, SetEnhMetaFile,
SetIcon sau SetCursor. Instructiunile:

m_wndStatic.Create (_T (""), WS_CHILD WS_VISIBLE SS_ICON,


rect, this, IDC_STATIC);
m_wndStatic.SetIcon (hIcon);

creaz un CS care afis. o icoana si ii atasam icoana cu SetIcon. Dreptughiul este marit automat pentru a cuprinde
imaginea. Exista o serie de falg-uri care pot fi folosite pentru a controla modul de afisare al imaginii in control
(SS_CENTERIMAGE = are ca cerinta majora, drept. de afisare tr. sa fie destul de mare pentru a cuprinde imaginea),
Implicit, un CS nu trimite mesaje de notificare. Daca se creaza CS cu stilul SS_NOTIFY, at. CS trimite urm.
notificari:

Static Control Notifications


Notification Sent When Message-Map Macro
STN_CLICKED The control is clicked. ON_STN_CLICKED
STN_DBLCLK The control is double-clicked. ON_STN_DBLCLK
STN_DISABLE The control is disabled. ON_STN_DISABLE
STN_ENABLE The control is enabled. ON_STN_ENABLE

Notificarile STN_CLICKED si STN_DBLCLK permit crearea de CS care raspund la clic-uri de mouse, ca in ex.:

// In CMainWindow's message map


ON_STN_CLICKED (IDC_STATIC, OnClicked)

// In CMainWindow::OnCreate
m_wndStatic.Create (_T ("Click me"), WS_CHILD WS_VISIBLE
SS_CENTER SS_CENTERIMAGE SS_NOTIFY SS_SUNKEN, rect,
this, IDC_STATIC);

void CMainWindow::OnClicked ()
{
m_wndStatic.PostMessage (WM_CLOSE, 0, 0);
}
Clasa CEdit (CE)
CEdit din MFC incapsuleaza functionalitatea unui control de editare folosit pt. a edita text: pe o singura linie sau pe
mai multe linii. Zona client din Notepad este un control de editare multilinie. Un control de editare este limitat la 60
KB text. Daca e nevoie de mai mult text vom folosi un control RICH EDIT (imbogatit).

Crearea unui control Edit

Daca m_wndEdit este un obiect CEdit instructiunea

m_wndEdit.Create (WS_CHILD WS_VISIBLE WS_BORDER


ES_AUTOHSCROLL, rect, this, IDC_EDIT);

creaza un control single line care face scroll orizontal automat, daca textul nu incape in zona de afisare. Incluzind
stilul ES_MULTILINE vom crea un CE multilinie:

m_wndEdit.Create (WS_CHILD WS_VISIBLE WS_BORDER


WS_HSCROLL WS_VSCROLL ES_MULTILINE, rect, this, IDC_EDIT);

WS_HSCROLL si WS_VSCROLL adauga barele de scroll vertical si orizontal. Putem folosi CEdit::SetRect sau
CEdit::SetRectNP pt. a defini zona editabila a controlului independent de marginile controlului. O utilizare pt. aceste
functii este de a defini marimea paginii care ramine constanta chiar daca controlul este redimensionat. Putem folosi
de asemenea CEdit::SetMargins pentru a specifica latimea (in pixeli) marginii stg si dreapta. Implicit latimile
marginilor sunt 0.
Cind este prima data creat, un CE va accepta numai 30,000 caractere. Putem modifica acest lucru cu
CEdit::LimitText sau CEdit::SetLimitText. Urmatoarea instructiune seteaza nr. max de car. la 32:

m_wndEdit.SetLimitText (32);

Cind folosim un CE multilinie, SetLimitText limiteaza cantitatea totala de text din control, deci nu lungimea fiecarei
linii. In acest caz putem controla lungimea liniei numai manual.
O metoda este de a folosi SetFont pt a comuta fontul CE la un font fixed-pitch si CEdit::SetRect pt a specifica
dreptunghiul de formatare a carui latime este un pic mai mare decit latimea caracterelor din font inmultita cu nr. de
caractere dorit a se afisa pe o linie.

Edit Control Styles


Style Description
ES_LEFT Left-aligns text in the control.
ES_CENTER Centers text in the control.
ES_RIGHT Right-aligns text in the control.
ES_AUTOHSCROLL Permits the edit control to scroll horizontally without a horizontal scroll bar. To
add a horizontal scroll bar, include the style WS_HSCROLL.
ES_AUTOVSCROLL Permits the edit control to scroll vertically without a vertical scroll bar. To add a
vertical scroll bar, include the style WS_VSCROLL.
ES_MULTILINE Creates a multiline edit control.
ES_LOWERCASE Displays all characters in lowercase.
ES_UPPERCASE Displays all characters in uppercase.
ES_PASSWORD Displays asterisks instead of typed characters.
ES_READONLY Creates an edit control whose text can't be edited.
ES_NOHIDESEL Prevents the edit control from hiding the selection when the control loses the input
focus.
ES_OEMCONVERT Performs an ANSI-to-OEM-to-ANSI conversion on all characters typed into the
control so that the application won't get unexpected results if it performs an ANSI-
to-OEM conversion of its own. Obsolete.
ES_WANTRETURN Programs the Enter key to insert line breaks instead of invoking the default push
button for multiline edit controls used in dialog boxes.
O alta functie folositoare pt a initializa un CE este CEdit::SetTabStops, care seteaza spatiile dintre tab_uri. Implicit
tab stopul este de 8 caractere. Ca si CListBox::SetTabStops, CEdit::SetTabStops masoara distanta in unitati de
dialog.

Inserarea si Regasirea Textului

Textul se insereaza cu SetWindowText si se regaseste cu GetWindowText. CEdit mosteneste ambele functii din clasa
de baza CWnd. Instructiunea

m_wndEdit.SetWindowText (_T ("Hello, MFC"));

insereaza textul "Hello, MFC" in controlul m_wndEdit, si

m_wndEdit.GetWindowText (string);

regaseste textul intr-un obiect CString numit string. GetWindowText si SetWindowText lucreaza cu ambele tipuri de
controale, single line si multiline. Textul inserat cu SetWindowText inlocuieste textul existent, iar GetWindowText
returneaza tot textul din control, chiar daca acesta este pe mai multe linii. Pt. a stegte textul apelam SetWindowText
cu un sir nul:

m_wndEdit.SetWindowText (_T (""));

Putem insera text fara a stege cel existent cu CEdit::ReplaceSel. Daca unul sau mai multe caractere sunt selectate
cind apelam ReplaceSel, textul care se insereaza inlocuieste textul selectat, in caz contrar textul este inserat la pozitia
curenta a cursorului (caret-ului).
Un control multiline insereaza line break automat. Daca dorim sa determinam line break-urile dintr-un text folosim
CEdit::FmtLines pt a face enable soft line breaks inainte de apelul lui GetWindowText:

m_wndEdit.FmtLines (TRUE);

Cu soft line breaks enabled, fiecare linie este delimitata cu doua CR (0x13) urmat de un LF (0x10). Pt. a invalida
soft line break folosim FmtLines( FALSE):

m_wndEdit.FmtLines (FALSE);

CR introdus in text la apasarea tastei <Enter> sunt semnificate de o pereche CR/LF. FmtLines nu afecteaza modul de
afisare al textului intr-un CE multilinie, ci afecteaza numai modul cum este memorat intern textul si formateaza
textul regasit cu GetWindowText.
Pentru a citi exact o linie de text dintr-un control multilinie folosim CEdit::GetLine. GetLine copie continutul unei
linii intr-un buffer pe care trebuie sa-l alocam si apoi furnizam functiei adresa acestuia. Linia este identificata de un
index 0-based. Instructiunea:

m_wndEdit.GetLine (0, pBuffer, nBufferSize);

copie prima linie din control in zona data de pBuffer, iar par. 3 indica dimensiunea buff. in bytes. GetLine returneaza
numarul de octeti copiati in buffer. Putem determina dinaninte marimea necesara a buff. cu fct. CEdit::LineLength,
iar numarul de linii din control il det. cu fct. CEdit::GetLineCount. GetLineCount nu returneaza niciodata 0, chiar
daca nu exista text valoarea returnata este 1.

Clear, Cut, Copy, Paste, and Undo

CEdit furnizeaza functii pentru operatiile enumerate mai sus. Instructiunea:

m_wndEdit.Clear ();

sterge textul selectat fara a afecta continutul clipboard-ului.Instructiunea:

m_wndEdit.Cut ();

sterge textul selectat si il copie in clipboard.Instructiunea:


m_wndEdit.Copy ();

copie textul selectat in clipboard fara a-l sterge.


Putem interoga CE pt. selectia curenta cu un apel al fct. CEdit::GetSel, care returneza o valoare DWORD ce contine
doi intregi pe 16 biti ce specifica indexul de inceput si indexul de sfarsit al selectiei. Daca indecsii sunt egali nu
exista text selectat. Exista o forma a fct. GetSel care copie indecsii in doi intregi ale caror adrese sunt pasate ca
parametrii prin referinta. Putem adauga urmatoare functie IsTextSelected, la clasa controlului de editare derivat din
CEdit pentru a determina daca exista sau nu text selectat in control:

BOOL CMyEdit::IsTextSelected ()
{
int nStart, nEnd;
GetSel (nStart, nEnd);
return (nStart != nEnd);
}

CEdit::Cut and CEdit::Copy nu fac nimic daca nu este text selectat. Textul poate fi selectat prin program cu
CEdit::SetSel. Instructiunea:

m_wndEdit.SetSel (100, 150);

selecteaza 50 de caractere incepind cu al 101-lea caracter si o face vizibila in view daca aceasta nu este vizibila (se
face scroll automat). Pt. a preveni defilarea (scrolling), vom folosi si al 3-lea param. al functiei cu valoarea TRUE.
Cind facem selectii prin program intr0un control multilinie, este necesar adesea sa convertim un numar de linie si
posibil un offset din interiorul acestei linii intr-un index pe care-l vom folosi in SetSel. Functia CEdit::LineIndex
accepta un numar de linie 0-based si returneaza indexul primului caracter din acea linie. In ex. care urmeaza se
determina index-ul primului caracter din linia 8 (LineIndex), apoi determinam lungimea liniei si selectam tot textul
care se gaseste in acea linie (SetSel):

int nStart = m_wndEdit.LineIndex (7);


int nLength = m_wndEdit.LineLength (nStart);
m_wndEdit.SetSel (nStart, nStart + nLength);

CEdit furnizeaza fct. LineFromChar pt. a calcula numarul liniei plecind de la index-ul unui caracter.
CEdit::Paste pastes text intr-un CE.

m_wndEdit.Paste ();

Daca clipboard-ul nu contine text, CEdit::Paste nu are efect. Daca nu exista text selectat cind se apeleaza Paste se
insereaza textul din clipboard la pozitia curenta a caret-ului. Daca exista o selectie, atunci textul din clipboard
inlocuieste selectia existenta. Putem determina din timp daca exista text in clipboard printr-un apel al fct.
::IsClipboardFormatAvailable. Instructiunea:

BOOL bCanPaste = ::IsClipboardFormatAvailable (CF_TEXT);

seteaza bCanPaste la o val. # 0 daca exista text in clipboard sau 0 in caz contrar. O alta trasatura a unui CE este
posibilitatea roll back-ului (undo). , reface ultima stergere:

m_wndEdit.Undo ();

Se poate determina din timp daca am putea apela Undo prinapelul fct. CEdit::CanUndo. O alta fct.,
CEdit::EmptyUndoBuffer, reseteaza manual flag-ul pentru undo, a.i., urmatoarele apeluri la Undo nu vor face nimic.

Notificarile Controlului de Editare

In app. MFC, notificarile sunt mapate cu macro-uri de forma ON_EN in harta de mesaje a clasei.
In ex. urm. se trateaza notificarea (mesaj) EN_CHANGE a unui CE. Un control de tip push buton
(m_wndPushButton) este facut enable/disable dupa cum exista/nu exista text in CE cu ID=IDC_EDIT si dat de ob.
(m_wndEdit) :
// In CMainWindow's message map
ON_EN_CHANGE (IDC_EDIT, OnUpdatePushButton)

void CMainWindow::OnUpdatePushButton ()
{
m_wndPushButton.EnableWindow (m_wndEdit.LineLength ());
}

Edit Control Notifications


Notification Sent When Message-Map Macro
EN_UPDATE The control's text is about to change. ON_EN_UPDATE
EN_CHANGE The control's text has changed. ON_EN_CHANGE
EN_KILLFOCUS The edit control loses the input focus. ON_EN_KILLFOCUS
EN_SETFOCUS The edit control receives the input focus. ON_EN_SETFOCUS
EN_HSCROLL The edit control is scrolled horizontally using a scroll bar. ON_EN_HSCROLL
EN_VSCROLL The edit control is scrolled vertically using a scroll bar. ON_EN_VSCROLL
EN_MAXTEXT A character can't be entered because the edit control ON_EN_MAXTEXT
already contains the number of characters specified with
CEdit::LimitText or CEdit::SetLimitText. This notification
is also sent if a character can't be entered because the
caret is at the right or the bottom edge of the control's
formatting rectangle and the control doesn't support
scrolling.
EN_ERRSPACE An operation fails because of insufficient memory. ON_EN_ERRSPACE

Clasa CComboBox (control combo box)


Un CB este format dintr-un CE si un LB.
Tipuri de Combo box-uri: simple, drop-down, si drop-down list.

CB simple (stil CBS_SIMPLE) sunt cele mai putin folosite. Trasatura principala a acestora este ca sunt permanent
afisate. Cind un utilizator selecteaza un art din lista, ac. art. este automat copiat in CE. Utilizatorul poate tipari text
direct in CE. Daca textul se potriveste cu un art din lista, art este automat pus pe video invers si se executa scroll-ul .

Un CB drop-down (stil CBS_DROPDOWN) difera de un CB simplu prin aceea ca lista este afisata numai la
cererea utilizatorului si nu permite introducerea de text in CE asociat.

Un CB drop-down list (stil CBS_DROPDOWNLIST) are in plus fata de CB drop-down bara de navigare verticala.
Stilurile se dau in functia Create or CreateEx . Alte stiluri exista pentru
cosmetizarea CB. Cind cream un CB trebuie sa punem stilul WS_VSCROLL daca
dorim scroll vertical . Daca m_wndComboBox este un obiect CComboBox,
instructiunea:

m_wndComboBox.Create (WS_CHILD WS_VISIBLE WS_BORDER


WS_VSCROLL CBS_DROPDOWNLIST CBS_SORT, rect, this,
IDC_COMBOBOX);

ceara un CB drop-down list care contine bara pt. scroll vertical. Dimensiunea controlului (dreptunghiul) trebuie sa
fie destul de mare pt. a afisa tot textul.

Combo Box Styles


Style Description
CBS_AUTOHSCROLL Enables horizontal scrolling in the edit control portion of a combo
box.
CBS_DISABLENOSCROLL Disables the combo box list box's scroll bar when it isn't needed.
Without this style, an unneeded scroll bar is hidden rather than
disabled.
CBS_DROPDOWN Creates a drop-down combo box.
CBS_DROPDOWNLIST Creates a drop-down list combo box.
CBS_HASSTRINGS Creates a combo box that "remembers" the strings added to it.
Conventional combo boxes have this style by default; owner-draw
combo boxes don't.
CBS_LOWERCASE Forces all text in the combo box to lowercase.
CBS_NOINTEGRALHEIGHT Prevents the combo box's list box height from having to be an exact
multiple of the item height.
CBS_OEMCONVERT A combo box whose edit control performs an ANSI-to-OEM-to-ANSI
conversion on all characters so that the application won't get
unexpected results if it performs an ANSI-to-OEM conversion of its
own. Obsolete.
CBS_OWNERDRAWFIXED Creates an owner-draw combo box whose items are all the same
height.
CBS_OWNERDRAWVARIABLE Creates an owner-draw combo box whose items can vary in height.
CBS_SIMPLE Creates a simple combo box.
CBS_SORT Automatically sorts items as they are added.
CBS_UPPERCASE Forces all text in the combo box to uppercase.

Exista asemanari intre fct din CE si LB.


Adaugare art se face cu CComboBox::AddString si CComboBox::InsertString.
Nr. max. de car. pt. CE al CB este setat cu CComboBox::LimitText. Fct. GetWindowText si SetWindowText lucreaza
pt. CE al CB.
Functii specifice: GetLBText, care regaseste textul unui art. identificat printr-un index 0-based.
GetLBTextLen, returneaza lung. unui art., in caractere;
ShowDropDown, afiseaza sau ascunde un CB drop-down list;
GetDroppedState, returneaza o valoare ce indica daca CB drop-down list este afisat.

Notificari Combo Box

Combo Box Notifications


Notification Message-Macro Map Sim Drop- Drop-Down
ple Down List
CBN_DROPDOWN ON_CBN_DROPDOWN
Sent when the drop-down list is displayed.
CBN_CLOSEUP ON_CBN_CLOSEUP
Sent when the drop-down list is closed.
CBN_DBLCLK ON_CBN_DBLCLK
Sent when an item is double-clicked.
CBN_SELCHANGE ON_CBN_SELCHANGE
Sent when the selection changes.
CBN_SELENDOK ON_CBN_SELENDOK
Sent when a selection is made.
CBN_SELENDCANCEL ON_CBN_SELENDCANCEL
Sent when a selection is canceled.
CBN_EDITUPDATE N_CBN_EDITUPDATE
Sent when the text in the edit control is
about to change.
CBN_EDITCHANGE ON_CBN_EDITCHANGE
Sent when the text in the edit control has
changed.
CBN_KILLFOCUS ON_CBN_KILLFOCUS
Sent when the combo box loses the input
focus.
CBN_SETFOCUS ON_CBN_SETFOCUS
Sent when the combo box receives the
input focus.
CBN_ERRSPACE ON_CBN_ERRSPACE
Sent when an operation fails because of
insufficient memory.
Nu toate notificarile se aplica la toate tipurile de CB.
Notificarile CBN_DROPDOWN si CBN_CLOSEUP nu sunt trimise la un CB simpla (CBS_SIMPLE) pt. ca un
asemenea CB este deschis tot timpul.
CB cu stilurile CBS_DROPDOWN si CBS_DROPDOWNLIST-nu primesc notificarea CBN_DBLCLK pt. ca pe
art. din lista nu se poate face dublu clic. (LB asociat CB se inchide dupa primul clic).
Notificarile CBN_EDITUPDATE si CBN_EDITCHANGE sunt echivalente cu EN_UPDATE si EN_CHANGE
trime de CE, si CBN_SELCHANGE este la fel cu LBN_SELCHANGE pt. LB.

Cind procesam notificarea CBN_SELCHANGE, CE asociat poate sa nu fie actualizat cu selectia din LB asociat. Va
trebui sa folosim GetLBText pentru a regasi noul text selectat in loc de GetWindowText.
Indexul art. selectat il gasim cu CComboBox::GetCurSel.

Clasa CScrollBar
Clasa CScrollBar incapsuleaza controlul scroll bar creat din "SCROLLBAR" WNDCLASS. Controalele scroll bar
sunt identice in cea mai mare parte cu ferestrele scroll bar. In timp ce ferestrele scroll bars sunt create cu stilurile
WS_VSCROLL si WS_HSCROLL, controalele scroll bar sunt create explicit cu CScrollBar::Create. Barele scroll
window sint lipite de fereastra principala, controalele scroll bar pot fi plasate oriunde in fereastra si pot fi setate la
orice latime si inaltime.
Stil SBS_VERT pentru CSB vertical si SBS_HORZ pentru orizontal. Daca m_wndVScrollBar si m_wndHScrollBar
sunt obiecte CScrollBar instructiunile:

m_wndVScrollBar.Create (WS_CHILD WS_VISIBLE WS_BORDER


SBS_VERT, rectVert, this, IDC_VSCROLLBAR);
m_wndHScrollBar.Create (WS_CHILD WS_VISIBLE WS_BORDER
SBS_HORZ, rectHorz, this, IDC_HSCROLLBAR);

creaza doua controale CSB, unul vertical si unul orizontal.


Obtinerea dim. standard folosite de W se obtin printr-un apel al fct. API ::GetSystemMetrics.

int nWidth = ::GetSystemMetrics (SM_CXVSCROLL);


int nHeight = ::GetSystemMetrics (SM_CYHSCROLL);

Ca alternativa la crearea CSB standard se poate specifica An alternative method for creating a scroll bar with a
standard height or width is to specify the style SBS_TOPALIGN, SBS_BOTTOMALIGN, SBS_LEFTALIGN, or
SBS_RIGHTALIGN when creating it. SBS_LEFTALIGN and SBS_RIGHTALIGN align a vertical scroll bar
control along the left or right border of the rectangle specified in the call to Create and assign it a standard width.
SBS_TOPALIGN and SBS_BOTTOMALIGN align a horizontal scroll bar control along the top or bottom border of
the rectangle and assign it a standard height.
Unlike the other classic controls, scroll bar controls don't send WM_COMMAND messages; they send
WM_VSCROLL and WM_HSCROLL messages instead. MFC applications process these messages with OnVScroll
and OnHScroll handlers, as described in Chapter 2. I didn't mention two scroll bar notification codes in Chapter 2
because they apply only to scroll bar controls. SB_TOP means that the user pressed the Home key while the scroll
bar had the input focus, and SB_BOTTOM means the user pressed End.
MFC's CScrollBar class includes a handful of functions for manipulating scroll bars, most of which should seem
familiar to you because they work just like the similarly named CWnd functions. CScrollBar::GetScrollPos and
CScrollBar::SetScrollPos get and set the scroll bar's thumb position. CScrollBar::GetScrollRange and
CScrollBar::SetScrollRange get and set the scroll bar range. You use CScrollBar::SetScrollInfo to set the range,
position, and thumb size in one step. For details, refer to the discussion of CWnd::SetScrollInfo in Chapter 2.

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