Visual C++ 2010 Express pentru tăți
Last Updated: Nov 14 2013 22:56, Started by
dani.user
, Feb 23 2013 13:10
·
0
#1
Posted 23 February 2013 - 13:10
Intrucat foarte multi elevi/studenti de buna voie sau la indicatiile altora, doresc compilatoare de pe vremea raposatului, creez acest mic tutorial pentru cei ce doresc sa traiasca totusi in deceniul asta.
Acest tutorial presupune ca aveti habar ce e C, ce e C++ si, mai ales, ca ati citit Lucruri pe care orice programator ar trebui să le ştie
Va urma |
#2
Posted 23 February 2013 - 13:42
Vreau sa vad daca are elemente GUI (butoane, listboxuri etc.) daca vrei sa faci un proiect GUI fiindca eu stiam ca varianta Expres (Free) nu ofera acest lucru.
|
#3
Posted 23 February 2013 - 13:54
#4
Posted 23 February 2013 - 23:16
Quote Ok, dar suntem in 2013, nu vreau sa scriu tot aplicatii care aduna numere in DOS, vreau sa invat Java/C# sa fac aplicatii adevarate... Nimic mai fals. Aceste aplicatii interactioneaza cu utilizatorul prin intermediul consolei, insa sunt aplicatii Windows. Si ce mod mai simplu de a demonstra asta, decat prin cateva exemple. Ia incercati, puteti realiza asta sub MS-DOS?
|
#5
Posted 23 February 2013 - 23:52
Quote Bine bine, dar m-am saturat de consola, vreau sa creez o interfata grafica Bun ... pai, de unde sa incep? [5 minutes later] Asa. Windows-ul, cum de altfel ii zice si numele, iti permite sa creezi interfete grafice de cand e. API-ul de baza e unul procedural (adica il poti folosi linistit din C, nu-i nevoie de ++) si e similar cu cel pe 16-biti de acum 20 ani, urmele "mostenirii" fiind destul de evidente pe ici pe colo si ducand uneori la intrebari de genul: asta de ce e asa? Problema construirii unei interfete grafice nu are o solutie unica. Daca n-ai ce face, nu te opreste nimeni din a desena manual linie cu linie, punct cu punct, fiecare element si a verifica constant coordonatele mouse-ului. Ce voi prezenta mai departe e metoda standard sau sa-i zic clasica de creere a interfetelor grafice sub Windows si are urmatoarele particularitati:
Asa cum s-a vazut in primul post, cand dorim sa creem un nou proiect, Visual C++ ne intreaba daca nu dorim o Aplicatie Windows. Alegand acest sablon, el ne va oferi ceva cod de-a gata care afiseaza un ecran. Quote Ce-i asta??? Parca programam in C... C si este La prima vedere, sablonul pare destul de complex, dar voi incerca sa-l explic pas cu pas si sa-l simplific, eliminand unele elemente mai putin necesare pentru inceput. Pana la final, va fi un program ce permite adunarea a 2 numere (foarte complex nu?) si care prezinta si cum se poate desena ceva folosind acest API.
gdi.png 29.13K 264 downloads iar codul este: // GUIExample.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "GUIExample.h" #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name HWND hEcranPrincipal; //ecranul principal HFONT hDefaultFont; //fontul implicit HWND hCasutaTextA; //casuta text pentru A HWND hCasutaTextB; //casuta text pentru B HWND hButonSuma; //buton suma HWND hRezultat; //label pentru afisare rezultat // Forward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void Deseneaza(HDC hdc); void ConstruiesteElemente(HWND); void Aduna_Click(void); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Place code here. MSG msg; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_GUIEXAMPLE, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_GUIEXAMPLE)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_3DSHADOW); wcex.lpszMenuName = 0; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // FUNCTION: InitInstance(HINSTANCE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; // Store instance handle in our global variable hEcranPrincipal = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hEcranPrincipal) { return FALSE; } ShowWindow(hEcranPrincipal, nCmdShow); UpdateWindow(hEcranPrincipal); return TRUE; } // // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; HFONT hFontPrecedent; switch (message) { case WM_CREATE: ConstruiesteElemente(hWnd); break; case WM_COMMAND: if ((HWND)lParam == hButonSuma) { Aduna_Click(); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hFontPrecedent = (HFONT)SelectObject(hdc, hDefaultFont); //tin minte fontul precedent Deseneaza(hdc); SelectObject(hdc, hFontPrecedent); //pun la loc fontul precedent EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void ConstruiesteElemente(HWND hEcranParinte) { HWND hTemp; hDefaultFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); //aleg fontul implicit din sistem hTemp = CreateWindow(_T("STATIC"), _T("Introduceţi valoarea A:"), WS_CHILD | WS_VISIBLE, 10, 20, 140, 20, hEcranParinte, NULL, hInst, NULL); SendMessage(hTemp, WM_SETFONT, (WPARAM)hDefaultFont, TRUE); hCasutaTextA = CreateWindowEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T("1"), WS_BORDER | WS_CHILD | WS_VISIBLE, 140, 20, 100, 20, hEcranParinte, NULL, hInst, NULL); SendMessage(hCasutaTextA, WM_SETFONT, (WPARAM)hDefaultFont, TRUE); hTemp = CreateWindow(_T("STATIC"), _T("Introduceţi valoarea B:"), WS_CHILD | WS_VISIBLE, 10, 50, 140, 20, hEcranParinte, NULL, hInst, NULL); SendMessage(hTemp, WM_SETFONT, (WPARAM)hDefaultFont, TRUE); hCasutaTextB = CreateWindowEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T("2"), WS_BORDER | WS_CHILD | WS_VISIBLE, 140, 50, 100, 20, hEcranParinte, NULL, hInst, NULL); SendMessage(hCasutaTextB, WM_SETFONT, (WPARAM)hDefaultFont, TRUE); hTemp = CreateWindow(_T("STATIC"), _T("Rezultat:"), WS_CHILD | WS_VISIBLE, 10, 80, 140, 20, hEcranParinte, NULL, hInst, NULL); SendMessage(hTemp, WM_SETFONT, (WPARAM)hDefaultFont, TRUE); hRezultat = CreateWindow(_T("STATIC"), _T("3"), WS_CHILD | WS_VISIBLE | SS_RIGHT, 140, 80, 100, 20, hEcranParinte, NULL, hInst, NULL); SendMessage(hRezultat, WM_SETFONT, (WPARAM)hDefaultFont, TRUE); hButonSuma = CreateWindow(_T("BUTTON"), _T("Adună"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 250, 20, 50, 80, hEcranParinte, NULL, hInst, NULL); SendMessage(hButonSuma, WM_SETFONT, (WPARAM)hDefaultFont, TRUE); } void Aduna_Click(void) { //s-a apasat butonul Adună TCHAR textA[128] = {0}; TCHAR textB[128] = {0}; Edit_GetText(hCasutaTextA, textA, sizeof(textA) / sizeof(TCHAR)); //citim textul introdus in casuta A Edit_GetText(hCasutaTextB, textB, sizeof(textB) / sizeof(TCHAR)); //citim textul introdus in casuta B double a = _ttof(textA); //extrag un double din sirul de caractere double b = _ttof(textB); //extrag un double din sirul de caractere double suma = a + b; TCHAR textSuma[128] = {0}; _stprintf_s(textSuma, 128, _T("%f"), suma); //adaug valoarea rezultatul in sirul de caractere Edit_SetText(hRezultat, textSuma); } void Deseneaza(HDC hdc) { SetBkMode(hdc, TRANSPARENT); //fundal transparent pentru desenare //specific culoarea textului (24 biti/pixel - 16.7 mil culori posibile) si tin minte culoarea precedenta COLORREF culoarePrecedenta = SetTextColor(hdc, RGB(0x5F, 0, 0xFF)); RECT rect; //definesc un dreptunghi rect.top = 100; rect.left = 500; rect.right = rect.left + 200; rect.bottom = rect.top + 50; //creez "pixuri" pentru a desena conturul dreptunghiului HPEN hPens[4] = { CreatePen(PS_SOLID, 2, RGB(0, 0, 0)), CreatePen(PS_DASH, 1, RGB(0, 0xA0, 0)), CreatePen(PS_DOT, 1, RGB(0, 0, 0xCC)), CreatePen(PS_DASHDOT, 1, RGB(0xB4, 0, 0)), }; MoveToEx(hdc, rect.left, rect.top, NULL); SelectObject(hdc, hPens[0]); LineTo(hdc, rect.right, rect.top); SelectObject(hdc, hPens[1]); LineTo(hdc, rect.right, rect.bottom); SelectObject(hdc, hPens[2]); LineTo(hdc, rect.left, rect.bottom); SelectObject(hdc, hPens[3]); LineTo(hdc, rect.left, rect.top); for (int i = 0; i < 4; i++) DeleteObject(hPens[i]); rect.top += 10; //pentru a desena textul putin mai jos DrawText(hdc, _T("Ia uite că pot desena\r\n şi fără graphics.h"), -1, &rect, DT_CENTER); rect.top += 200; rect.right += 200; rect.bottom += 200; HFONT hAltFont = CreateFont(-MulDiv(14, GetDeviceCaps(hdc, LOGPIXELSY), 72), //dimensiune comparabila cu cea folosita din editoarele de text 0, 0, 0, FW_NORMAL, //grosime TRUE, //italic FALSE, //underline FALSE, //strikeout DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, FF_DONTCARE, _T("Comic Sans MS")); HFONT hFontPrecedent = (HFONT)SelectObject(hdc, hAltFont); DrawText(hdc, _T("Desenat folosind Comic Sans MS"), -1, &rect, DT_LEFT); DeleteObject(hAltFont); SelectObject(hdc, hFontPrecedent); } Ce am prezentat mai sus nu se vrea un tutorial complet pentru aceasta tehnologie, pentru asta gasiti suficienta documentatie pe net. Alte tehnologii pentru GUI:
|
#6
Posted 24 February 2013 - 00:38
o singura observatie
Atunci cand aplicatia se doreste a fi rulata pe alt sistem, se executa din terminal/consola/Command Prompt NU CU DUBLU-CLICK |
#7
Posted 24 February 2013 - 10:31
De ce _tmain si nu main ? De ce cu t si de ce cu _ ?
De ce TCHAR ? Ce e ala si de unde stii ca nu trebuia acolo simplu char ? De ce de tipar ? |
#8
Posted 24 February 2013 - 10:42
Click dreapta pe cuvantul ce nu-l intelegi si te duce la definitie/sursa.
Uite si tipuri noi definite in Windows (de asta avem typedef in sintaxa): http://msdn.microsof...1(v=vs.85).aspx _tmain() nu exista in C/C++ standard dar e o extensie a lui Microsoft. In plus a aparut pentru o trecere "usoara" de la char pe 1 octet la Unicode/multibyte fiindca in functie de setarile proiectului rezulta in urma preprocesarii main() ori wmain(). In rest citeste notiuni de baza din programarea Windows. Edited by neagu_laurentiu, 24 February 2013 - 10:51. |
#9
Posted 24 February 2013 - 11:33
Pe vremea lui Windows98/ME, acestora, spre deosebire de NT/2000, le lipseau mare parte din functii pentru lucrul cu siruri de caractere UNICODE.
Prin urmare trebuia sa scrii o aplicatie (Unicode) pentru NT/2000, si alta, "chioara" pentru 98/ME. Folosind insa TCHAR si functiile cu _t, pur si simplu activai/dezactivai un macro si aveai o aplicatie fie unicode, fie nu. In libraria standard C, pentru fiecare functie ce vrea un char* ai una si care accepta wchar_t*, iar in WinAPI ai la fel, functii cu sufixul A respectiv cu sufixul W si cate un #ifdef de forma #ifdef UNICODE #define SetWindowText SetWindowTextW #else #define SetWindowText SetWindowTextA #endif // !UNICODE |
#10
Posted 24 February 2013 - 12:35
Eu sunt axat pe programare web, adica php, javascript, python & stuff. Vreau sa invat putin si din programarea dektop. Pot instala doar Visual C++ cu MFC? Nu vreau Visual Studio, vreau doar VC++ cu MFC.
|
|
#11
Posted 24 February 2013 - 12:40
MFC e doar in varianta platita si nu e nici cea mai usoara tehnologie GUI de invatat si nici de folosit.
|
#12
Posted 24 February 2013 - 12:43
De la varianta Visual Studio .NET (2002) nu se mai poate, totul e la pachet.
Oricum VC++ Express nu are MFC, acesta din urma e doar in varianta pe bani. Dar sunt destule alte biblioteci pentru GUI. dani.user, on 24 februarie 2013 - 12:40, said:
MFC [...] nu e nici cea mai usoara tehnologie GUI de invatat si nici de folosit. Edited by neagu_laurentiu, 24 February 2013 - 12:43. |
#13
Posted 24 February 2013 - 12:47
Eu as vrea aplicatii native, .NET nu imi place.
Edited by mihai_logic, 24 February 2013 - 12:48. |
#15
Posted 24 February 2013 - 12:52
|
#16
Posted 26 February 2013 - 22:36
#17
Posted 08 April 2013 - 21:46
La mine nu este "Aplicatie Windows". Aveti idee de ce? Chiar dacă am Visual C++ 2005, nu ar trebui să am? Windows Forms este.
Attached Files |
#18
Posted 08 April 2013 - 21:56
Acea versiune nu avea disponibila optiunea in cauza in mod direct.
http://www.codeproje...s-Edition-to-De Treci totusi la una mai actuala. |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users