

// INCLUDES ///////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN  // no para o MFC

#include <windows.h>   // todos os headers do windows
#include <windowsx.h>  // algumas macros


// DEFINES ////////////////////////////////////////////////

// Nome da classe 
#define WINDOW_CLASS_NAME "EXEMPLO8"

// GLOBALS ////////////////////////////////////////////////


//bitmap sizes
const int BITMAPHEIGHT=32;
const int BITMAPWIDTH=64;

//memory dc
HDC hdcMem=NULL;
//bitmaps
HBITMAP hbmNew=NULL;
HBITMAP hbmOld=NULL;



// FUNCTIONS //////////////////////////////////////////////
LRESULT CALLBACK MyWindowProc(HWND hwnd, 
						    UINT msg, 
                            WPARAM wparam, 
                            LPARAM lparam)
{

PAINTSTRUCT		ps;		// usado em  WM_PAINT
HDC				hdc;	// apontador para um  device context



switch(msg)
	{	
	case WM_CREATE: 
        {
		// cdigo de inicializacao do programa

        // returna OK
		return(0);
		} break;
	case WM_LBUTTONDOWN:
		{

		hdc=GetDC(hwnd);

		//copia da memria para a tela
		BitBlt(hdc,LOWORD(lparam)-BITMAPWIDTH/2,HIWORD(lparam)-BITMAPHEIGHT/2,BITMAPWIDTH,BITMAPHEIGHT,hdcMem,0,0,SRCINVERT);

		
		ReleaseDC(hwnd,hdc);

		
		return(0);
		}break;


	case WM_PAINT: 
		{
		//  valida a janela
		hdc = BeginPaint(hwnd,&ps);	 
		// o codigo grafico vem aqui

        EndPaint(hwnd,&ps);

        // returna OK
		return(0);
   		} break;


	case WM_DESTROY: 
		{
		// mata a aplicacao, manda a mensagem WM_QUIT para a pilha 
		PostQuitMessage(0);

        // returna OK
		return(0);
		} break;

	default:break;

    } // end switch

// processa o resto das mensagens 
return (DefWindowProc(hwnd, msg, wparam, lparam));

} 


bool Prog_Init(HWND hWndMain)
{

	HDC hdc=GetDC(hWndMain);


	hdcMem=CreateCompatibleDC(hdc);


	ReleaseDC(hWndMain,hdc);


	hbmNew=(HBITMAP)LoadImage(NULL,"pic.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);


	hbmOld=(HBITMAP)SelectObject(hdcMem,hbmNew);

	return(true);
}

//////////////////////////////////////////////////////////////////////////////
//CLEANUP
//////////////////////////////////////////////////////////////////////////////
void Prog_Done(HWND hWndMain)
{


	SelectObject(hdcMem,hbmOld);


	DeleteObject(hbmNew);


	DeleteDC(hdcMem);
}


// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain(	HINSTANCE hinstance,
					HINSTANCE hprevinstance,
					LPSTR lpcmdline,
					int ncmdshow)
{

WNDCLASSEX winclass; 
HWND	   hwnd;	 // apontador da janela
MSG		   msg;		 // mensagem generica


// Tamanho da estrutura
winclass.cbSize=sizeof(WNDCLASSEX);

// Estilo
winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;

// Ponteiro para a winproc
winclass.lpfnWndProc=MyWindowProc;

// Projetado para informar ao windows do espao extra que a
// estrutura deveria guardar para informaes em tempo de execuo.
// Na prtica, atribua 0 (zero);
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;

// Ponteiro para a aplicao (que recebemos do winmain). 
winclass.hInstance = hinstance;

//Carrega o icone da janela (normal e pequeno)
winclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
winclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);

//Carrega o Cursor default da janela 
winclass.hCursor = LoadCursor(NULL,IDC_ARROW);

//Mostra ao windows como pintar o background
winclass.hbrBackground =  (HBRUSH) GetStockObject(BLACK_BRUSH);

//Nome do menu que a janela deve carregar dos recursos da aplicao
winclass.lpszMenuName=NULL;

//Nome atribuido a esta classe de janela
winclass.lpszClassName=WINDOW_CLASS_NAME;


// Registra a classe definida
if (!RegisterClassEx(&winclass))
	return(0);

// Cria a janela
if (!(hwnd = CreateWindowEx(NULL, // extended style
                            WINDOW_CLASS_NAME,   // class
						    "Exemplo 8 - SRCINVERT", // title
						    WS_SYSMENU | WS_VISIBLE,
					 	    0,0,	    // initial x,y
						    400,400,  // initial width, height
						    NULL,	    // handle to parent 
						    NULL,	    // handle to menu
						    hinstance,// instance of this application
						    NULL)))	// extra creation parms
return(0);


if(!Prog_Init(hwnd)) return(0);
//  loop principal
while(GetMessage(&msg,NULL,0,0)) //sai do loop quando WM_QUIT eh a mensagem; bloqueia se nao houver mensagem
 	 { 
	 // Traduz uma mensagem WM_KEYDOWN para WM_CHAR
	 TranslateMessage(&msg);

	 // Manda para winproc
	 DispatchMessage(&msg);
	 } 
Prog_Done(hwnd);

return(msg.wParam);

} 

///////////////////////////////////////////////////////////

