MPP – Laborator nr. 1 Laboratorul Nr. 1 La lansarea mediului Visual C++ este afişată fereastra Visual Studio. Visual Studio a purtat numele de Developer Studio. Acronimul IDE (Integrated Development Environment) este uneori întâlnit ca şi referire la Visual Studio. Visual Studio – interfaţa cu utilizatorul a lui Visual C++, suprafaţa de lucru. Începerea unei noi aplicaţii presupune crearea unui nou proiect, folosit pentru administrarea tuturor elementelor care compun un program Visual C++ şi care au ca rezultat o aplicaţie Windows. File NewProject va afişa caseta de dialog NewProject. Pentru specificarea tipului proiectului, în secţiunea Project types se selectează MFC, iar în secţiunea Templates, MFC Application, ce are ca efect crearea unui proiect având ca rezultat un program executabil Windows standard. 1 MPP – Laborator nr. 1 Visual C++ este însoţit de biblioteca de clase de bază Microsoft. MFC (Microsoft Foundation Classes) este o mulţime de clase predefinite. În secţiunea Name se introduce numele proiectului, iar la Location se precizează directorul în care vor fi situate fişierele proiectului. În cadrul casetei de dialog NewProject se efectuează un clic pe OK pentru a iniţia generarea proiectului. Se va deschide caseta de dialog MFC Application Wizard. AppWizard are rolul de a crea un schelet de program ce va putea fi extins ulterior. Caseta de dialog MFC Application Wizard oferă, în secţiunea Application Type, trei opţiuni pentru tipul de interfaţă a aplicaţiei: Single Document Multiple Documents Dialog Based Selectăm ultima opţiune. 2 MPP – Laborator nr. 1 În cadrul secţiunii Resource language se poate selecta limba care va fi folosită pentru resurse. În secţiunea Generated Classes sunt confirmate detaliile proiectului ce va fi creat de AppWizard: numele claselor C++ din proiect. Apoi se efectuează un clic pe butonul Finish şi se deschide proiectul nou creat. Secţiunea afişată în partea stângă a lui Visual Studio poartă denumirea de secţiunea spaţiului de lucru. Această secţiune oferă paginile: Solution Explorer, ClassView, Property Manager, ResourceView. Revenirea la casetele de dialog cu opţiuni MFC Application Wizard în cadrul unui proiect existent nu este posibilă. Visual Studio oferă posibilitatea creării unei configuraţii de asamblare în două variante: versiunea pentru depanare şi versiunea finală a unui fişier executabil. Versiunea pentru depanare oferă posibilitatea inspectării codului executat şi verificarea valorilor variabilelor. 3 MPP – Laborator nr. 1 Compilarea se realizează prin apăsarea tastei F7 sau selectarea opţiunii Build Solution din meniul Build. Pagina Output înfăţişeză informaţii privind procesul de asamblare. Rularea aplicaţiei se face prin selectarea opţiunii Start Without Debugging din meniul Debug sau se foloseşte combinaţia de taste Ctrl+F5. Fereastra aplicaţiei create va conţine două butoane OK şi Cancel şi afişează un text. Elementele vizuale ale unui proiect se numesc resurse (exemplu: casete de dialog, pictograme, meniuri etc.). Pentru adăugarea unui buton în cadrul machetei de dialog a proiectului, se va deschide mai întâi macheta casetei de dialog astfel: Se selectează pagina ResourceView Se expandează lista de resurse şi catalogul Dialog În consecinţă apar doi identificatori: o IDD_ABOUTBOX şi IDD_NumeProiect_DIALOG Printr-un dublu clic pe identificatorul IDD_NumeProiect_DIALOG se va afişa macheta ferestrei de dialog principale a aplicaţiei. 4 MPP – Laborator nr. 1 Se va înlătura controlul etichetă TODO, se selectează un control buton din caseta cu controale care se trage pe macheta ferestrei de dialog. Eticheta butonului se poate modifica prin tastarea noii etichete fie direct, de la tastatură, fie se va modifica secţiunea Caption, din fereastra Properties, cu condiţia ca butonul să fie selectat (adică încadrat de un dreptunghi de formatare). În dreapta ferestrei se va afişa secţiunea Properties pentru IDC_BUTTON1. În cadrul secţiunii ID se tastează IDC_NumeNou (în acest caz IDC_PressMe). Pentru a asocia un cod noului buton se procedează astfel: Clic cu butonul drept pe butonul nou creat Din meniul contextual afişat se selectează opţiunea AddEventHandler Se va deschide caseta de dialog Event Handler Wizard – Nume_proiect Se selectează BN_CLICKED din lista Message type, funcţia este adăugată ca şi membru al clasei CNumeProiectDlg, iar în secţiunea Function handler name se indică numele funcţiei, OnBnClickedNume_funcţie. Clic pe butonul Add and Edit 5 MPP – Laborator nr. 1 În acest moment se va adăuga un cod. De exemplu: void CNumeProiectDlg::OnBnClickedPressMe() { //TODO: Add zour control notification handler code MessageBox((LPCWSTR)L”Thanks, I needed that !”); } Aplicaţia nr. 1: Să se realizeze o aplicaţie care verifică dacă un număr este prim. Reamintim că un număr este prim dacă se divide numai prin 1 şi prin el însuşi. Dacă numărul nu este prim se va preciza primul divizor propriu (găsit) al acestuia. Rezolvarea problemei presupune două etape: Proiectarea intefeţei; Realizarea funcţionalităţii aplicaţiei. 6 MPP – Laborator nr. 1 După crearea resursei dialog, se vor adăuga în ea controalele corespunzătoare: [1] o casetă text static (Static Text) [2] un câmp de editare (Edit Control) [3, 4] două butoane de comandă (Button) [5] butonul de comandă Cancel, creat de MFC Application Wizard (căruia îi modificăm aspectul). 7 MPP – Laborator nr. 1 Modificăm proprietăţile controalelor: Se selectează controlul; Modificările se vor face în fereastra Properties din dreapta ecranului; Pentru câmpul de editare utilizăm identificatorul IDC_NUMAR; Pentru butonul de comandă Resetare – IDC_RESETARE; Pentru butonul de comandă Verfică dacă este prim – IDC_VERIFICA. Maparea de variabile membru peste controalele resursei dialog: Se selectează controlul; Se efectuează clic dreapta pe control, iar din meniul afişat se selectează Add Variable ...; Se va deschide căsuţa de dialog Add Member Variable Wizard, în cadrul căreia selectăm în secţiunea Category – Value, la Variable type – int, la Variable name – Nr. Apoi se apasă butonul Finish. 8 MPP – Laborator nr. 1 Interceptarea mesajelor prin adăugarea handlerelor: Se selectează controlul de tip Button; Se efectuează clic dreapta pe acesta, iar din meniul afişat se selectează AddEventHandler..., ce are ca efect deschiderea căsuţei de dialog Event Handler Wizard; Se selectează BN_CLICKED din lista Message type, funcţia este adăugată ca şi membru al clasei CNumeProiectDlg, iar în secţiunea Function handler name se indică numele funcţiei, OnBnClickedNume_funcţie; Clic apoi pe butonul Add and Edit Folosim metoda UpdateData() (moştenită de clasa CNumeProiectDlg de la clasa de bază CDialog) – care asigură transferul de date de la controale la variabilele mapate. Are doi parametri: TRUE (valoarea implicită) şi FALSE. Control TRUE ---------------------------------------- Variabilă mapată --------------------------------------FALSE 9 MPP – Laborator nr. 1 #include<math.h> void CNumar_primDlg::OnBnClickedVerifica() { // TODO: Add your control notification handler code here UpdateData(); CString text; int n; n=Nr; for(int i=2;i<=sqrt((float)n);i++) if(n%i==0) { text.Format((LPCWSTR)L"Numarul %d nu este prim (se divide prin %d)",n,i); AfxMessageBox(text); return; } text.Format((LPCWSTR)L"Numarul %d este prim",n); AfxMessageBox(text); UpdateData(FALSE); } 10 MPP – Laborator nr. 1 Pentru butonul Resetare, având ID-ul IDC_RESETARE, scriem codul: void CNumar_primDlg::OnBnClickedResetare() { // TODO: Add your control notification handler code here Nr=0; UpdateData(FALSE); } Aplicaţie propusă: 1. Să se calculeze suma divizorilor proprii ai numărului dat (se observă imediat că dacă această sumă este 0, numărul este prim). Exemplu: pentru numărul 12 suma va fi 15=2+3+4+6. 2. Să se determine cel mai mic număr prim cel puţin egal cu numărul dat. Exemplu: dacă se dă numărul 21, numărul prim căutat va fi 23. 3. Să se determine cel mai mare număr prim cel mult egal cu numărul dat. Exemplu: dacă se dă numărul 21, numărul prim căutat va fi 19. 11