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 Buttons List boxes Edit controls Combo boxes Scroll bars Static controls WNDCLASS "BUTTON" "LISTBOX" "EDIT" "COMBOBOX" "SCROLLBAR" "STATIC" MFC Class CButton CListBox CEdit CComboBox CScrollBar 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 BS_PUSHBUTTON BS_DEFPUSHBUTTON BS_CHECKBOX BS_AUTOCHECKBOX BS_3STATE BS_AUTO3STATE BS_RADIOBUTTON BS_AUTORADIOBUTTON BS_GROUPBOX Description Creates a standard push button control Creates a default push button; used in dialog boxes to identify the push button that's clicked if Enter is pressed Creates a check box control Creates a check box control that checks and unchecks itself when clicked Creates a three-state check box control Creates a three-state check box control that cycles through three states checked, unchecked, and indeterminatewhen clicked Creates a radio button control Creates a radio button control that, when clicked, checks itself and unchecks other radio buttons in the group 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 BS_LEFTTEXT

Description Moves the text accompanying a radio button or check box control from the button's right (the default) to its left

BS_RIGHTBUTTON BS_LEFT BS_CENTER BS_RIGHT BS_TOP BS_VCENTER BS_BOTTOM BS_MULTILINE

Same as BS_LEFTTEXT Left justifies the button text in the control rectangle Centers the button text in the control rectangle Right justifies the button text in the control rectangle Positions the button text at the top of the control rectangle Positions the button text in the center of the control rectangle vertically Positions the button text at the bottom of the control rectangle 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_GROUP BS_AUTORADIOBUTTON, rect1, this, m_wndRadioButton2.Create (_T ("COM2"), WS_CHILD BS_AUTORADIOBUTTON, rect2, this, IDC_COM2); m_wndRadioButton3.Create (_T ("COM3"), WS_CHILD BS_AUTORADIOBUTTON, rect3, this, IDC_COM3); m_wndRadioButton4.Create (_T ("COM4"), WS_CHILD BS_AUTORADIOBUTTON, rect4, this, IDC_COM4); m_wndRadioButton1.SetCheck (BST_CHECKED); WS_VISIBLE IDC_COM1); WS_VISIBLE WS_VISIBLE WS_VISIBLE

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 LBS_STANDARD Description 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

LBS_HASSTRINGS LBS_WANTKEYBOARDINPUT LBS_NOINTEGRALHEIGHT

is added or removed. 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. 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. 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 LBN_SETFOCUS LBN_KILLFOCUS LBN_ERRSPACE Sent When Message-Map Macro ON_LBN_SETFOCUS ON_LBN_KILLFOCUS ON_LBN_ERRSPACE ON_LBN_DBLCLK ON_LBN_SELCHANGE ON_LBN_SELCANCEL LBS_NOTIFY Required? No No No Yes Yes Yes

The list box gains the input focus. The list box loses the input focus. An operation failed because of insufficient memory. LBN_DBLCLK An item is double-clicked. LBN_SELCHANGE The selection changes. LBN_SELCANCEL The selection is canceled.

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 SS_BLACKFRAME SS_BLACKRECT SS_ETCHEDFRAME SS_ETCHEDHORZ SS_ETCHEDVERT SS_GRAYFRAME Description Hollow rectangle painted in the system color COLOR_WINDOWFRAME (default = black) Solid rectangle painted in the system color COLOR_WINDOWFRAME (default = black) Hollow rectangle with etched borders Hollow rectangle with etched top and bottom borders Hollow rectangle with etched left and right borders Hollow rectangle painted in the system color COLOR_BACKGROUND (default

SS_GRAYRECT SS_WHITEFRAME SS_WHITERECT Instructiunea:

= gray) Solid rectangle painted in the system color COLOR_BACKGROUND (default = gray) Hollow rectangle painted in the system color COLOR_WINDOW (default = white) Solid rectangle painted in the system color COLOR_WINDOW (default = white)

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 SS_BITMAP SS_ENHMETAFILE SS_ICON Description A static control that displays a bitmap A static control that displays a metafile 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 STN_CLICKED The control is clicked. STN_DBLCLK The control is double-clicked. STN_DISABLE The control is disabled. STN_ENABLE The control is enabled. Message-Map Macro ON_STN_CLICKED ON_STN_DBLCLK ON_STN_DISABLE 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 ES_LEFT ES_CENTER ES_RIGHT ES_AUTOHSCROLL ES_AUTOVSCROLL ES_MULTILINE ES_LOWERCASE ES_UPPERCASE ES_PASSWORD ES_READONLY ES_NOHIDESEL ES_OEMCONVERT ES_WANTRETURN Description Left-aligns text in the control. Centers text in the control. Right-aligns text in the control. Permits the edit control to scroll horizontally without a horizontal scroll bar. To add a horizontal scroll bar, include the style WS_HSCROLL. Permits the edit control to scroll vertically without a vertical scroll bar. To add a vertical scroll bar, include the style WS_VSCROLL. Creates a multiline edit control. Displays all characters in lowercase. Displays all characters in uppercase. Displays asterisks instead of typed characters. Creates an edit control whose text can't be edited. Prevents the edit control from hiding the selection when the control loses the input focus. 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. 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 EN_UPDATE The control's text is about to change. EN_CHANGE The control's text has changed. EN_KILLFOCUS The edit control loses the input focus. EN_SETFOCUS The edit control receives the input focus. EN_HSCROLL The edit control is scrolled horizontally using a scroll bar. EN_VSCROLL The edit control is scrolled vertically using a scroll bar. EN_MAXTEXT A character can't be entered because the edit control 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. Message-Map Macro ON_EN_UPDATE ON_EN_CHANGE ON_EN_KILLFOCUS ON_EN_SETFOCUS ON_EN_HSCROLL ON_EN_VSCROLL ON_EN_MAXTEXT

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 CBS_AUTOHSCROLL Description Enables horizontal scrolling in the edit control portion of a combo box.

CBS_DISABLENOSCROLL CBS_DROPDOWN CBS_DROPDOWNLIST CBS_HASSTRINGS CBS_LOWERCASE CBS_NOINTEGRALHEIGHT CBS_OEMCONVERT

CBS_OWNERDRAWFIXED CBS_OWNERDRAWVARIABLE CBS_SIMPLE CBS_SORT CBS_UPPERCASE

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. Creates a drop-down combo box. Creates a drop-down list combo box. 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. Forces all text in the combo box to lowercase. Prevents the combo box's list box height from having to be an exact multiple of the item height. A combo box whose edit control performs an ANSI-to-OEM-toANSI 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. Creates an owner-draw combo box whose items are all the same height. Creates an owner-draw combo box whose items can vary in height. Creates a simple combo box. Automatically sorts items as they are added. 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 CBN_DROPDOWN Sent when the drop-down list is displayed. CBN_CLOSEUP Sent when the drop-down list is closed. CBN_DBLCLK Sent when an item is double-clicked. CBN_SELCHANGE Sent when the selection changes. CBN_SELENDOK Sent when a selection is made. CBN_SELENDCANCEL Sent when a selection is canceled. CBN_EDITUPDATE Sent when the text in the edit control is about to change. CBN_EDITCHANGE Sent when the text in the edit control has changed. CBN_KILLFOCUS Sent when the combo box loses the input focus. CBN_SETFOCUS Sent when the combo box receives the

Message-Macro Map ON_CBN_DROPDOWN ON_CBN_CLOSEUP ON_CBN_DBLCLK ON_CBN_SELCHANGE ON_CBN_SELENDOK ON_CBN_SELENDCANCEL N_CBN_EDITUPDATE ON_CBN_EDITCHANGE ON_CBN_KILLFOCUS ON_CBN_SETFOCUS

Sim ple

DropDown

Drop-Down List

input focus. CBN_ERRSPACE Sent when an operation fails because of insufficient memory.

ON_CBN_ERRSPACE

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.