Con risposta 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:48
    Moderatore
     
     Con risposta Contiene codice

    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:40
    Moderatore
     
     

    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/