Вы находитесь на странице: 1из 4

Programare orientată pe obiecte

Lucrarea de laborator 7.

Visual C++ MFC Bare de control. Dialoguri comune. Foi de proprietăţi.

1.1.1 Bare de control


Barele de control sunt elemente de interfaţă cu utilizatorul, folosite pentru a conţine alte
controale sau alte ferestre. Există trei categorii de bare de control:
Barele de stare - reprezintă cel mai simplu tip de bare de control. Barele de control sunt în
permanenţă afişate în partea de jos a unei ferestre cadru.
Bare de instrumente - conţin butoane folosite drept comenzi rapide de meniu.
Bare de dialog - conţin butoane şi alte categorii de controale, cum ar fi casetele
combinate, casetele listă sau controalele de desfăşurare.

1.1.2 Bare de stare


Barele de stare sunt un element standard al interfeţei cu utilizatorul. O bară de stare este o
bară de control aflată în partea de jos a cadrului unei aplicaţii. Barele de stare sunt, de obicei,
divizate în mai multe panouri, cunoscute şi sub numele de indicatori. De exemplu, aplicaţiile
create cu AppWizard are panouri destinate afişării stării tastelor Num Lock şi Caps Lock.
Într-un program MFC, toate barele de control aparţin ferestrei principale. Clasa cadru
principală, CMainFrame, conţine un obiect CStatusBar denumit m_wndStatusBar care este creat
şi iniţializat în funcţia CMainFrame::OnCreate().

if(!m_wndStatusBar.Create(this)||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0(“Nu s-a reusit crearea unei bare de stare \n”)
return –1;
}

Înainte de a crea o bară de stare, trebuie creată o matrice de identificatori de resursă,


folosiţi pentru fiecare panou al barei de stare. Această matrice de identificatori este transmisă ca
parametru funcţiei SetIndicators(). Identificatorii se folosesc pentru a identifica fiecare panou al
barei de stare şi şirul text prestabilit pentru fiecare panou în parte. Este necesară atribuirea unei
resurse şir prestabilite pentru fiecare panou adăugat barei de stare.
Proprietăţile unui panou din bara de stare se stabilesc apelând funcţia SetPaneInfo.

m_wndStatusbar.SetPaneInfo(4, ID_INDICATOR_TIME, SBPS_POPOUT, 80);


Funcţia SetPaneInfo primeşte ca parametrii: indexul panoului, identificatorul panoului,
stilul panoului şi lăţimea acestuia. Stilurile de panou disponibile sunt:

- SBPS_STRECH - arată că acel panou se poate extinde pentru a acoperi spaţiul nefolosit.
Un singur panou dintr-o bară de stare poate avea acest atribut, App Wizard atribuindu-l
primului panou.
- SBPS_NOBORDER - arată că nu se va desena nici o margine tridimensională în jurul
panoului.
- SBPS_POPOUT - indică trasarea unei margini inverse.
- SBPS_NORMAL - creează o bară de stare fără extindere, margini sau efecte de ieşire în
relief.
- SBPS_DISABLED - indică faptul că nu va scrie nici un text.

Un exemplu de bară de stare îl reprezintă adăugarea unui nou panou care să indice ora
curentă.
- Adăugarea unui nou panou implică următoarele operaţii;
- Adăugarea unui identificator în matricea de identificator;
- Adăugarea unui articol de text prestabilit în tabelul de şiruri;
- Adăugarea unui instrument de actualizare a comenzii pentru panoul respectiv.

1.1.3 Adăugarea unui identificator nou


Exerciţiu 1. Se va crea o aplicație de tip single document. Pentru a defini un nou simbol
de resursă, selectaţi modul Resource View din meniul View. Din meniul Edit selectați Resource
Symbols, apoi New şi introduceţi numele unui nou simbol ca fiind ID_INDICATOR_TIME.
În fişierul sursă MainFrame.cpp se află un vector UINT utilizat pentru a defini aspectul barei
de stare. Modificaţi vectorul indicators astfel încât să arate ca în listingul următor:

static UINT indicators[] =


{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
ID_INDICATOR_TIME
};

Pentru a adăuga o resursă tabel de şiruri folosind simbolul ID_INDICATOR_TIME se


procedează astfel:
- în eticheta Resource View din fereastra Project Workspace deschideţi resursa String
Table;
- inseraţi un nou articol în tabela de şiruri cu valoarea ID_INDICATOR_TIME drept
identificator.

1.1.4 Definirea cronometrului şi a stilurilor de panouri


Proprietăţile unui panou din bara de stare se stabilesc apelând funcţia SetPaneInfo .
m_wndStatusBar.SetPaneInfo(4 , ID_INDICATOR_TIME , SBPS_POPOUT , 80);

Funcţia SetPaneInfo are patru parametrii: indexul panoului, indentificatorul panoului,


stilul panoului şi lăţimea acestuia. Stilurile de panou disponibile sunt:
- SBPS_STRECH - permite extinderea panoului pentru a acoperi spaţiul nefolosit;
- SBPS_NOBORDER - arată că nu se va desena nici o margine tridimensională în jurul
panoului;
- SBPS_POPOUT - indică trasarea unei margini inverse;
- SBPS_NOMAL - creează o bară de stare fără extindere, margini sau efecte de ieşire în
relief;
- SBPS_DISABLED - indică faptul că nu va fi scris nici un text.

Se adaugă in funcția int CMainFrame::OnCreate(LPCREATESTRUCT


lpCreateStruct)un stil pentru noul articol din bara de stare şi se inițiliazează un cronometru
pentru fiecare secundă în funcţia:

m_wndStatusBar.SetPaneInfo(4 , ID_INDICATOR_TIME , SBPS_POPOUT , 80);


SetTimer(1,1000,NULL);

Tratarea resursei de ceas

Vizualizați proprietățile clasei CmainFrame făcând clic dreapta pe clasa și apoi


Properties. Intrati pe tabul Messages și selectați WM_TIMER, iar în colana următoare funcția
OnTimer. Această funcţie este apelată atunci când ceasul setat cu ajutorul funcţiei SetTimer
expiră.

void CMainFrame::OnTimer(UINT nIDEvent)


{
m_wndStatusBar.InvalidateRect(NULL);
}

Atunci când timpul expiră, panoul principal va invalida dreptunghiul barei de state,
determinând redesenarea acesteia.
Când bara de stare este invalidată, panoul MFC actualizează fiecare panou folosind un
instrument CCmdUI. Deşi se poate folosi ClassWizard pentru a crea asemenea instrumente
pentru majoritatea obiectelor de interfaţă cu utilizatorul, instrumentele pentru manevrarea
panourilor unei bare de stare trebuie create manual.
Adăugaţi o declaraţie pentru funcţia de actualizare CCmdUI în declaraţia clasei
CMainFrame. Este necesară adăugarea unei singure linii de cod, şi anume declaraţia pentru
OnUpdateTimer in MainFrm.h:

protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
afx_msg void OnUpdateTimer(CCmdUI* pCmdUI);
DECLARE_MESSAGE_MAP()

În continuare, adăugaţi intrarea în harta de mesaje din MainFrame.cpp, după cum


urmează:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateTimer)
END_MESSAGE_MAP()

Adăugaţi funcţia OnUpdateTimer în fişierul MainFrame.cpp:

void CMainFrame::OnUpdateTimer(CCmdUI* pCmdUI){


//Activarea panoului
pCmdUI->Enable();
//Obtinerea orei curente
CTime theTime=CTime::GetCurrentTime();
CString szTime=theTime.Format("%I:%M:%S %p");
//Completarea panoului cu ora curenta
pCmdUI->SetText(szTime);
}

Compilaţi şi executaţi exemplul creat. Acum, bara de stare are un nou panou, situat la
extremitatea dreaptă, care conţine ora curentă.