Modelul de programare Windows
Mesajele sunt "inima" oricarei aplicatii Windows. Cand apare un eveniment ce afecteaza aplicatia, sunt trimise acesteia niste mesaje ce identifica evenimentul respectiv. Fiecare mesaj are un scop bine definit. Exemple de evenimente: miscarea mouse-ului, apasarea butoanelor de mouse, apasarea unei taste, modificarea dimensiunii ferestrelor, apasarea butoanelor, alegerea optiunilor din meniu, initializarea aplicatiei, etc. Deci, programele scrise pentru Microsoft Windows reactioneaza la evenimentele externe, comunicate ferestrei principale a aplicatiei prin mesaje.
O aplicatie Windows este o aplicatie orientata pe mesaje. Astfel ca orice aplicatie windows va avea o zona distincta de cod dedicata pentru primirea si distribuirea mesajelor. In aceasta bucla de mesaje (in MFC apare in functia Run a clasei CWinApp) se ia cate un mesaj (generat de un eveniment) din coada de mesaje si il trimite obiectului care trebuie sa-l trateze. Fiecare obiect ce poate trata mesaje (derivat din CCmdTarget) are o metoda speciala prin care se redistribuie mesajele functiilor handler corespunzatoare (WindowProc), sau daca acestea nu sunt definite, mesajele sunt tratate local. Pentru toate aplicatiile majoritatea mesajelor sunt tratate implicit de CWnd::WindowProc.
Motivele pentru folosirea mesajelor:
Spre deosebire de apelul unei functii, un mesaj este o informatie ce poate fi usor prioritizata si plasata intr-o coada de asteptare;
Un mesaj nu este dependent de un anumit limbaj sau de un anumit procesor, astfel ca un program bazat pe mesaje poate fi portat usor pe un alt CPU.
In MFC exista cate o functie handler dedicata tratarii fiecarui mesaj sau se pot construi functii pentru tratarea lor. Aceste functii sunt membrii ai unei clase si implementeaza raspunsul aplicatiei la aparitia mesajului respectiv. Scrierea acestor functii reprezinta un procent destul de mare din scrierea aplicatiei; de aceea pentru scrierea lor se poate folosi ClassWizard.
In functie de provenienta mesajelor acestea se impart in doua categorii:
mesaje trimise de sistemul de operare (initializarea programului, incheierea programului, mutarea si redimensionarea unei ferestre, etc.)
mesaje trimise de utilizator (de la controale).
In functie de tip exista trei categorii de mesaje:
mesaje Windows - sunt mesajele care incep cu WM_, cu exceptia lui WM_COMMAND. Aceste mesaje au si parametrii ce sunt folositi la tratarea mesajelor respective;
mesaje de notificare - sunt mesajele WM_COMMAND provenite de la controale, ferestre copii, catre fereastra parinte;
mesaje de comanda - sunt notificari WM_COMMAND provenite de la meniul aplicatiei, bara de butoane, acceleratori.
Pentru primele doua tipuri de mesaje obiectul cadru (CFrameWnd) al aplicatiei doar distribuie mesajele, fiind apoi tratate de ferestre - obiecte derivate din CWnd. Mesajele din categoria a treia pot fi tratate de un numar mai mare de obiecte: documente, aplicatia, etc. (Ex. Open - CDocument)
Majoritatea mesajelor sunt rezultatul interactiunii utilizatorului cu aplicatia. Functia membru Run() a clasei CWinApp preia aceste mesaje si le distribuie catre obiectele derivate din CWnd corespunzatoare. Fiecare obiect capabil sa primeasca mesaje sau comenzi are propria harta de mesaje pe baza careia se asociaza fiecarui mesaj sau comanda o functie handler. Cand un obiect primeste un mesaj sau comanda il cauta in propria harta de mesaje. Daca il gaseste atunci se executa functia corespunzatoare.
Mesajele pot fi trimise oricarui obiect care le poate trata (are metoda WindowProc - orice obiect derivat din CCmdTarget). Mesajele trimise unui obiect sunt plasate intr-o coada de mesaje, iar funtia WindowProc le ia pe rand si le trateaza.
Responsabilitatea programatorului cand lucreaza cu mesaje este realizarea hartii de mesaje (cu ClassWizard) si scrierea functiilor handler.
Toate mesajele sunt in mod uzual trimise ferestrei MainFrame principale, insa comenzile sunt apoi rutate catre celelalte obiecte. Fereastra cadru ruteaza comenzile catre o secventa standard de obiecte, asteptandu-se ca unul dintre acestea sa aiba un handler.
Fiecare obiect ruteaza comanda in urmatorii pasi:
catre obiectul copil activ;
catre el insusi;
catre alte obiecte.
DECLARE_MESSAGE_MAP
Fiecare clasa derivata din CCmdTarget din program trebuie sa aiba definita o harta de mesaje pentru a le putea trata. Pentru aceasta se foloseste macro-ul DECLARE_MESSAGE_MAP plasat la sfarsitul declararii clasei. Apoi, in fisierul .CPP corespunzator clasei, se folosesc macro-urile BEGIN_MESSAGE_MAP si END_MESSAGE_MAP, pentru delimitarea hartii de mesaje.
// example for DECLARE_MESSAGE_MAP
class CMyWnd : public CFrameWnd
BEGIN_MESSAGE_MAP( theClass, baseClass )
theClass - clasa pentru care se declara harta de mesaje
baseClass - clasa din care este derivata theClass.
// example for BEGIN_MESSAGE_MAP
BEGIN_MESSAGE_MAP( CMyWindow, CFrameWnd )
//}AFX_MSG_MAP
END_MESSAGE_MAP( )
Pentru cele trei tipuri de mesaje definite mai sus avem urmatoarele categorii de macro-uri:
Mesajele WM_COMMAND generate din meniu sau de catre acceleratori:
intrarea in harta de mesaje: ON_COMMAND(<id>, <memberFxn>)
prototipul functiei: afx_msg void memberFxn( ).
Mesajele de notificare generate de ferestrele copii:
handler-e pentru un controale generice
ON_CONTROL( <wNotifyCode>, <id>, <memberFxn> )
afx_msg void memberFxn( );
handler-e pentru butoane
ON_BN_CLICKED( <id>, <memberFxn> )
ON_BN_DISABLE( <id>, <memberFxn> )
ON_BN_DOUBLECLICKED( <id>, <memberFxn> )
ON_BN_HILITE( <id>, <memberFxn> )
ON_BN_PAINT( <id>, <memberFxn> )
ON_BN_UNHILITE( <id>, <memberFxn> )
afx_msg void memberFxn( );
handler-e pentru Combo Box
ON_CBN_CLOSEUP( <id>, <memberFxn> )
ON_CBN_DBLCLK( <id>, <memberFxn> )
ON_CBN_DROPDOWN( <id>, <memberFxn> )
ON_CBN_EDITCHANGE( <id>, <memberFxn> )
ON_CBN_EDITUPDATE( <id>, <memberFxn> )
ON_CBN_ERRSPACE( <id>, <memberFxn> )
ON_CBN_KILLFOCUS( <id>, <memberFxn> )
ON_CBN_SELCHANGE( <id>, <memberFxn> )
ON_CBN_SELENDCANCEL( <id>, <memberFxn> )
ON_CBN_SELENDOK( <id>, <memberFxn> )
ON_CBN_SETFOCUS( <id>, <memberFxn> )
afx_msg void memberFxn( );
handler-e pentru Edit Control
ON_EN_CHANGE( <id>, <memberFxn> )
ON_EN_ERRSPACE( <id>, <memberFxn> )
ON_EN_HSCROLL( <id>, <memberFxn> )
ON_EN_KILLFOCUS( <id>, <memberFxn> )
ON_EN_MAXTEXT( <id>, <memberFxn> )
ON_EN_SETFOCUS( <id>, <memberFxn> )
ON_EN_UPDATE( <id>, <memberFxn> )
ON_EN_VSCROLL( <id>, <memberFxn> )
afx_msg void memberFxn( );
handler-e pentru List Box
ON_LBN_DBLCLK( <id>, <memberFxn> )
ON_LBN_ERRSPACE( <id>, <memberFxn> )
ON_LBN_KILLFOCUS( <id>, <memberFxn> )
ON_LBN_SELCHANGE( <id>, <memberFxn> )
ON_LBN_SETFOCUS( <id>, <memberFxn> )
afx_msg void memberFxn( );
Mesajele WM_MESSAGE. Pentru fiecare dintre aceste mesaje exista cate un macro dedicat si o functie membru dedicata.
Ex. ON_WM_ACTIVATE( )
afx_msg void OnActivate( UINT, CWnd*, BOOL );
Pe langa acestea mai exista si un al patrulea tip
Mesajele definite de utilizator (programator). Pentru acestea se folosesc:
ON_MESSAGE( <message>, <memberFxn> )
ON_REGISTERED_MESSAGE( <nMessageVariable>, <memberFxn> )
ON_THREAD_MESSAGE( <message>, <memberFxn> )
ON_REGISTERED_THREAD_MESSAGE( <nMessageVariable>, <memberFxn> )
afx_msg void memberFxn( UINT, LONG );
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |