

// 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 "EXEMPLO5"

// GLOBALS ////////////////////////////////////////////////
HPEN            hpenNew; // caneta atribuida ao DC.
HPEN			hpenOld;
HRGN			hrgnClip;

// 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_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) {
	hpenNew = CreatePen(PS_SOLID,0,RGB(255,0,0));
	RECT rcClient;
	GetClientRect(hWndMain,&rcClient);

	// Cria a regio
	hrgnClip = CreateEllipticRgn(0,0,rcClient.right,rcClient.bottom);
	HDC hdc = GetDC(hWndMain);
	hpenOld = (HPEN) SelectObject(hdc,hpenNew);
	SelectObject(hdc,hrgnClip);
		
	

	// Desenha as linhas verticais
	int nStripX=rcClient.right/10;
	int nCount;

	for (nCount=0;nCount<10;nCount++) {
		MoveToEx(hdc,nStripX*nCount,0,NULL);
		LineTo(hdc,nStripX*nCount,rcClient.bottom);
	}
		
	

	//Desenha as linhas horizontais
	int nStripY=rcClient.bottom/10;
	

	for (nCount=0;nCount<10;nCount++) {
		MoveToEx(hdc,0,nStripY*nCount,NULL);
		LineTo(hdc,rcClient.right,nStripY*nCount);
	}	

	ReleaseDC(hWndMain,hdc);
	return true;

}

void Prog_Done(HWND hWndMain){
	HDC hdc = GetDC(hWndMain);
	SelectObject(hdc,hpenOld);
	ReleaseDC(hWndMain,hdc);

	// Deleta o objeto 
	DeleteObject(hpenNew);
	DeleteObject(hrgnClip);
}

// 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(WHITE_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 5", // title
						    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
					 	    0,0,	    // initial x,y
						    400,300,  // initial width, height
						    NULL,	    // handle to parent 
						    NULL,	    // handle to menu
						    hinstance,// instance of this application
						    NULL)))	// extra creation parms
return(0);

Prog_Init(hwnd);
//  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);

} 

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

