Listato C++
-
venerdì 9 marzo 2012 16:58
Buona sera, sono un totalmente ignorante del mondo C++ che qualche mese fa ha deciso di studiare questo mondo. Purtroppo il mio lavoro e i miei impegni non mi consentono di svolgere un'attività di studio intensa, tuttavia da molti anni soffro la frustrazione di non poter scatenare la mia fantasia fino ai limiti consentiti dalla macchina, e quando ho un pò di tempo e sono in vena di sognare, penso a C++ . Ormai sembra assodato che per scendere ai livelli bassi, l'uso di questo linguaggio e, non so se dico bene, a maggior ragione del suo compilatore, rappresentano la scelta migliore.
Se non chiedo troppo, qualcuno di voi potrebbe fornirmi, o dirmi dove eventualmente reperirlo, un unico file, un listato, contenente il codice sorgente da passare al compilatore che generi un .exe per Windows 7,o se possibile per tutte le versioni di Windows, trasportabile/eseguibile su qualunque Pc dotato di tale OS, che quando eseguito mostri una finestra contenente 2 TextBox e un Button e che quando si fa click sul Button ciò che contiene la prima TextBox Viene mostrato/copiato anche nella seconda ?
Non voglio usare per ora, Visual Studio; solo la command line.
Grazie !!!
mario formosa
Tutte le risposte
-
venerdì 9 marzo 2012 19:48Moderatore
Ciao,
ecco qui sotto l'esempio da te richiesto:
//File TextBoxCopia.cpp //Definizioni classiche per la compilazione in release unicode #define WIN32 #define NDEBUG #define _WINDOWS #define _UNICODE #define UNICODE //Aggiungo la dipendenza per i controlli stile Windows XP #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") //Indico al linker di aggiungere nel processo di linking //le due librerie necessarie per l'esecuzione dell'applicazione #pragma comment(lib, "kernel32.lib") #pragma comment(lib, "user32.lib") //Sorgente principale #include <sdkddkver.h> #include <windows.h> #include <tchar.h> TCHAR * szWindowClass = _T("WndClassName"); TCHAR * szWindowTitle = _T("Titolo finestra"); ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE hInstance, int nCmdShow); LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HWND hWndTextBox1, hWndTextBox2, hWndButton; //Punto d'ingresso dell'applicazione int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } //Loop per la cattura e la gestione dei messaggi delle finestre dell'applicazione MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } //Funzione che registra il nome della classe 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_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); return RegisterClassEx(&wcex); } //Funzione che inizializza tutti i controlli dell'applicazione BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; //Creo la finestra principale hWnd = CreateWindowEx(NULL, szWindowClass, szWindowTitle, WS_OVERLAPPEDWINDOW, 50, 50, 245, 120, NULL, NULL, hInstance, NULL); //Creo la prima textbox hWndTextBox1 = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", _T("Prima"), WS_CHILD | WS_TABSTOP | WS_VISIBLE, 10, 10, 100, 21, hWnd, NULL, hInstance, NULL); //Creo la seconda textbox hWndTextBox2 = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", _T("Seconda"), WS_CHILD | WS_TABSTOP | WS_VISIBLE, 10, 51, 100, 21, hWnd, NULL, hInstance, NULL); //Creo il pulsante di copia hWndButton = CreateWindowEx(NULL, L"BUTTON", _T("Copia testo"), WS_CHILD | WS_TABSTOP | WS_VISIBLE, 120, 10, 100, 62, hWnd, NULL, hInstance, NULL); //Controllo che le finestre siano state create con successo if (!hWnd || !hWndButton || !hWndTextBox1 || !hWndTextBox2) { return FALSE; } //Visualizzo la finestra ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //Window Procedure dei messaggi inviati da hWnd LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; switch (uMsg) { case WM_COMMAND: //Controllo che l'evento sia il click sul pulsante if(HIWORD(wParam) == BN_CLICKED) { //Ottengo la lunghezza della stringa int len = GetWindowTextLength(hWndTextBox1) + 1; //Alloco la memoria per salvare la stringa LPWSTR lpsz = (LPWSTR)malloc(sizeof(TCHAR)*len); //Leggo la stringa e la memorizzo in lpsz GetWindowText(hWndTextBox1, lpsz, len); //Imposto il testo della seconda casella con il contenuto di lpsz SetWindowText(hWndTextBox2, lpsz); //Libero la memoria utilizzata free(lpsz); } break; //Inserire codice per eventuali disegni grafici sulla finestra case WM_PAINT: hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; //La finestra si chiude case WM_DESTROY: PostQuitMessage(0); break; //Demando la gestione dei messaggi non gestiti alla Window Procedure di default default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0L; }L'esempio fà uso delle Windows API, non dipende né da ATL né dalle MFC.
Per compilarlo è necessario aver installato la Windows SDK.Per compilarlo riporto qui di seguito la riga di comando che eseguo nei rari casi in cui non uso Visual Studio. Essa contiene opzioni per l'ottimizzazione del codice, per le definizioni di tipi, la sicurezza del buffer. Se hai dubbi su queste opzioni fai una breve ricerca sull'MSDN Library e troverai una descrizione super dettagliata.
cl /Zc:wchar_t /Zc:forScope /EHsc /Ox /GL /MD /GS /Gd TextBoxCopia.cpp
Spero di averti messo tutto il necessario.
Buon lavoro....
Nicolò Zilio
Personal blog: http://nicolozilio.wordpress.com/(With technical articles)
Personal Web site: http://nicolozilio.altervista.org/- Contrassegnato come risposta Mario Formosa venerdì 9 marzo 2012 20:06
-
venerdì 9 marzo 2012 20:06
Grazie veramente di Cuore Nicolò, soprattutto per i commenti che hai messo nel codice.
Solo una Cosa : Per compilare mi serve l'SDK di Windows poi però se porto l'eseguibile su un altro PC li non mi serve l'SDK giusto ?
Grazie Ancora.
mario formosa
-
sabato 10 marzo 2012 12:40Moderatore
Grazie veramente di Cuore Nicolò, soprattutto per i commenti che hai messo nel codice.
Solo una Cosa : Per compilare mi serve l'SDK di Windows poi però se porto l'eseguibile su un altro PC li non mi serve l'SDK giusto ?
Grazie Ancora.
mario formosa
Ciao,
no non serve l'SDK sul computer che eseguirà l'applicazione.
E' però necessario installere il Visual C++ 2010 redist per l'esecuzione (come specificato dall'opzione /MD).
Nicolò Zilio
Personal blog: http://nicolozilio.wordpress.com/(With technical articles)
Personal Web site: http://nicolozilio.altervista.org/

