Clasa de iarnă MFC
Biblioteca MFC conține o ierarhie de clasă mare scrisă în C ++. Structura ierarhiei este prezentată în Fig. 1. La vârful său este clasa Cobject, care conține diferite funcții utilizate la timpul de execuție și destinate, în special, să furnizeze informații despre tipul curent la timpul de execuție, pentru diagnosticare și pentru serializare.
Informații despre tipul de timp de execuție
diagnosticare
Fiecare clasă derivată de la CObject poate, la cerere, să verifice starea sa internă și să furnizeze informații de diagnosticare. Acest lucru este folosit extensiv în MFC pentru depanare.
serializarea
Serializarea este un mecanism care vă permite să transformați starea curentă a unui obiect într-un flux de octet serial, care este de obicei scris pe disc și să restabiliți starea obiectului din fluxul serial, de obicei atunci când citiți de pe disc. Aceasta vă permite să salvați starea curentă a aplicației pe disc și să o restabiliți când o porniți mai târziu.
Clasele principale
Unele clase sunt generate direct de la CObject. Cele mai utilizate dintre ele sunt CCmdTarget, CFile, CDC, CGDIObject și CMenu. Clasa CCmdTarget este destinată procesării mesajelor. Class CFile este proiectat pentru a lucra cu fișiere. Clasa CDC oferă suport pentru contextele dispozitivului. Vom vorbi mai târziu despre contextele dispozitivului. Această clasă include aproape toate funcțiile graficii GDI. CGDIObject este clasa de bază pentru diverse obiecte DGI, cum ar fi pene, perii, fonturi și altele. Clasa CMenu este concepută pentru manipularea meniului. O clasă foarte importantă CWnd este generată de clasa CCmdTarget. Este fundamental pentru crearea tuturor tipurilor de ferestre, inclusiv casete de dialog scalabile ("obișnuite") și de dialog, precum și diverse controale. Cea mai folosită clasă derivată este CFrameWnd. Așa cum veți vedea în viitor, în majoritatea programelor fereastra principală este creată folosind această clasă specială.
Din clasa CCmdTarget, prin intermediul clasei CWinThread, probabil este generată numai una dintre cele mai importante clase, acces la care în programele MFC are loc direct: CWinApp. Aceasta este una dintre clasele fundamentale, deoarece este concepută pentru a crea aplicația în sine. În fiecare program există un singur obiect al acestei clase. Odată ce a fost creată, aplicația va începe să fie executată.
Membrii funcționează în MFC
Majoritatea funcțiilor care sunt numite în programul MFC sunt membri ai uneia dintre clasele definite în bibliotecă. Cele mai multe funcții API sunt disponibile prin intermediul funcțiilor membrilor MFC. Totuși, puteți accesa direct funcțiile API. Uneori acest lucru este necesar, dar în majoritatea cazurilor este mai convenabil să se utilizeze funcțiile membrilor MFC.
Funcțiile globale în MFC
Există o serie de funcții globale în bibliotecă. Toate încep cu prefixul Afx. (Atunci când MFC este dezvoltat numai, proiectul a fost numit AFX, Application Framework. După o serie de modificări semnificative AFX a fost reproiectate în MFC, dar numele vechi este păstrat în multe identificatori ai bibliotecii și numele fișierelor.) De exemplu, foarte des folosit AfxMessageBox () funcție care afișează în avans o casetă de mesaje specifică. Dar există, de asemenea, un membru al messageBox funcției (). Astfel, deseori funcțiile globale sunt înlăturate de funcțiile membre.
AFXWIN.H fișier
Toate programele MFC includ fișierul antet AFXWIN.H. Acesta, precum și diverse fișiere auxiliare, conține descrieri de clase, structuri, variabile și alte obiecte MFC. Conectează automat majoritatea fișierelor antet MFC, inclusiv WINDOWS.H, care definește toate funcțiile API-ului Windows și alte obiecte care sunt utilizate în programele tradiționale C și API-ul "curat".
Cadrul programului MFC
Acum vom crea o aplicație mică folosind MFC. Afișează doar fereastra standard Windows și nu face nimic altceva. Când fereastra este închisă, aplicația este terminată. Această aplicație va servi drept bază pentru toate celelalte aplicații pe care le vom lua în considerare.
În cel mai simplu caz, un program scris cu MFC conține două clase generate de clasele de ierarhie ale bibliotecii: clasa utilizată pentru a crea aplicația și clasa utilizată pentru a crea fereastra. Cu alte cuvinte, pentru a crea un program minimal, trebuie să generați o clasă de la CWinApp, iar cealaltă din CFrameWnd. Aceste două clase sunt obligatorii pentru orice program.
Pe lângă crearea claselor de mai sus, programul ar trebui să organizeze și procesarea tuturor mesajelor provenite din Windows. În acest exemplu, programul nu face nimic util, deci nu trebuie să răspundeți la fiecare mesaj. MFC va procesa toate mesajele care nu ne interesează. Cu toate acestea, în acest exemplu, există o hartă a răspunsurilor la mesaje sau doar o hartă a mesajelor. Mai târziu ne vom uita în detaliu.
Mai jos este codul sursă al programului. Vom plasa întotdeauna declarații de clasă și implementarea lor în fișiere separate. Aceasta corespunde practicii acceptate de programare în C ++.
Exemplu de cod sursă
Fig. 2. O fereastră creată de cea mai simplă aplicație pe MFC
Rezultatul executării programului este prezentat în Fig. 2. Luați în considerare programul în detaliu.
Pentru a crea o fereastră standard într-o aplicație, o clasă din CFrameWnd trebuie moștenită. În acest exemplu, se numește CMainWin. Acesta conține constructorul și macroul DECLARE_MESSAGE_MAP (). De fapt, macroul se extinde într-o declarație a hărții de mesaje, care determină ce funcție de membru a clasei ar trebui să fie apelată ca răspuns la mesajul Windows. Această macrocomandă este aplicată oricărei ferestre în care sunt procesate mesajele. Trebuie să fie ultima din declarația de clasă.
Fereastra în sine este creată în constructor prin apelarea funcției Create (). Această funcție este utilizată în aproape toate aplicațiile. Efectuează acțiuni pentru a crea o fereastră. În acest exemplu, se dă cel mai simplu caz de utilizare. Pentru moment, trebuie să știm că al doilea parametru definește titlul ferestrei, iar primul este cel mai adesea NULL.
Clasa CApp
Cererea este produsă de CWinApp. Această clasă este responsabilă de funcționarea programului. Exemplul folosește un membru al funcției cu următorul prototip: Aceasta este o funcție virtuală numită de fiecare dată când programul este pornit. Trebuie să efectueze toate acțiunile asociate inițializării aplicației. Funcția trebuie să returneze TRUE cu succes și FALSE altfel. În cazul nostru, funcția creează mai întâi un obiect de clasă CMainWin, iar pointerul la acesta este stocat în variabila m_pMainWnd. Această variabilă este un membru al clasei CWinThread. Acesta este de tipul CWnd * și este utilizat în aproape toate programele MFC deoarece conține un indicator în fereastra principală. În următoarele două linii, funcțiile membre ale ferestrei sunt chemați prin ea. Când fereastra este creată, se numește funcția cu prototipul: Parametrul specifică modul în care fereastra va fi afișată pe ecran. Cele mai comune valori sunt după cum urmează:
Fereastra este redusă la dimensiunea normală
Când primul apel ca o funcție a primului parametru se poate substitui m_nCmdShow membru, în care valoarea stocată a codului ferestrei de afișare transmis în program la pornire (de exemplu, un utilizator etichetă Windows 95 poate determina modul de afișare a ferestrei atunci când aplicația se execută).
Funcția UpdateWindow () trimite un mesaj la fereastră, care vă spune că conținutul său trebuie redesenat. În viitor, vom examina acest proces în detaliu.
La sfârșitul programului, harta de mesaje este implementată:
Prima macrocomandă are întotdeauna doi parametri, prima este clasa ferestrei, cea de-a doua este clasa din care a apărut clasa ferestrei. În acest exemplu, harta mesajului este goală, adică toate mesajele sunt procesate de MFC.
Exemplul a folosit funcția Create (), care de fapt are mulți parametri. Prototipul său este următorul:
Primul parametru, ClassName, specifică numele clasei ferestrei pentru subsistemul de ferestre Windows. De obicei, nu este nevoie să fie setat explicit, deoarece MFC face toate lucrările necesare de îndreptare. În aceste linii directoare nu vom folosi clasele noastre de ferestre. Parametrul Stil specifică stilul ferestrei. În mod implicit, se creează o fereastră suprapusă standard. Puteți specifica stilul prin combinarea cu ajutorul operației "sau" a mai multor constante dintre următoarele:
Bara de derulare verticală
În viitor, nu vom descrie în detaliu toate valorile posibile ale constantelor, deoarece puteți să vă referiți întotdeauna la ajutorul Visual C ++ și să obțineți informații detaliate.
Poziția inițială și mărimea ferestrei sunt determinate de parametrul XYSize. Aceasta este structura care definește coordonatele ecranului din colțul din dreapta sus și din colțul din dreapta jos al dreptunghiului în care va fi afișată fereastra.
Toți ceilalți parametri pe care îi vom folosi vor fi luați în considerare în secțiunile relevante.