#include <windows.h>

LPSTR NazwaKlasy = "KlasaOkna";

HWND hTextA, hTextB;

// obsługa zdarzeń, wywołana przes pętlę komunikatów
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
	case WM_COMMAND:  //obsługa przycisku
		DWORD dlug; 
     	LPSTR Bufor;
		switch( wParam )
		{
		case 101:  //symboliczny numer/identyfikator przycisku
			dlug = GetWindowTextLength( hTextA )+1;
			Bufor =( LPSTR ) GlobalAlloc( GPTR, dlug );
			GetWindowText( hTextA, Bufor, dlug );
			SetWindowText( hTextB, Bufor );
			GlobalFree( Bufor );
			break;
		case 102:  //symboliczny numer/identyfikator przycisku
			SetWindowText( hTextA, "Wyczysciłem" );
			break;
		case 103:  //symboliczny numer/identyfikator przycisku
			dlug = GetWindowTextLength( hTextA )+1;
			Bufor =( LPSTR ) GlobalAlloc( GPTR, dlug );
			GetWindowText( hTextA, Bufor, dlug );
			MessageBox( hwnd, Bufor, "Pokazuję tekst po lewej stronie", MB_ICONINFORMATION );
			GlobalFree( Bufor );
			break;
		case 104:  //symboliczny numer/identyfikator przycisku
			SetWindowText( hTextB, "Wyczysciłem" );
			break;
		case 105:  //symboliczny numer/identyfikator przycisku
			dlug = GetWindowTextLength( hTextB )+1;
			Bufor =( LPSTR ) GlobalAlloc( GPTR, dlug );
			GetWindowText( hTextB, Bufor, dlug );
			MessageBox( hwnd, Bufor, "Pokazuję tekst po prawej stronie", MB_ICONINFORMATION );
			GlobalFree( Bufor );
			break;
		}
		break;
    case WM_CLOSE:  
        DestroyWindow( hwnd );
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
    default:   
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    
    return 0;
}


// główna funkcja programu
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASSEX wc;	
    HWND hwnd;
	MSG Komunikat;

   // wypełnienie struktury okna
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    
    //rejestracja klasy okna
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Odmawia rejestracji okna!", "Problem...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
    // utworzenie okna
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Pole tekstowe", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL );
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Odmowa utworzenia okna!", "Błąd...", MB_ICONEXCLAMATION );
        return 1;
    }
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );
    

	//	Tutaj znajduje się główna część programu,
	//	gdzie znajdują się wszystkie funkcje wejścia i przesyłane są do WinProc.
		

	hTextA = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 
		40, 200, 150, 30, hwnd, NULL, hInstance, NULL );
	hTextB = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 
		440, 200, 150, 30, hwnd, NULL, hInstance, NULL );
	HWND hPrzyciskKopiuj = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "--> Kopiuj -->", WS_CHILD | WS_VISIBLE, 
		240, 200, 150, 30, hwnd, (HMENU)101, hInstance, NULL );
	HWND hPrzyciskCzyscA = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Wyczysc tekst", WS_CHILD | WS_VISIBLE, 
		40, 150, 150, 30, hwnd, (HMENU)102, hInstance, NULL );
	HWND hPrzyciskPokazA = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Pokaż tekst", WS_CHILD | WS_VISIBLE, 
		40, 250, 150, 30, hwnd, (HMENU)103, hInstance, NULL );
	HWND hPrzyciskCzyscB = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Wyczysc tekst", WS_CHILD | WS_VISIBLE, 
		440, 150, 150, 30, hwnd, (HMENU)104, hInstance, NULL );
	HWND hPrzyciskPokazB = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Pokaż tekst", WS_CHILD | WS_VISIBLE, 
		440, 250, 150, 30, hwnd, (HMENU)105, hInstance, NULL );

    //pętla komunikatów
    while( GetMessage( &Komunikat, NULL, 0, 0 ) >0 )
    {
        TranslateMessage( &Komunikat ); 
        DispatchMessage( &Komunikat );   //przesłanie komunikatów do WinProc
    }
    return Komunikat.wParam;
}
