/*------------------------------------------------------------
   Texel	(www.texel.fr.fm)		2001
   API WIN32
   Les bases - Chapitre 3 - Le GDI
   Affiche une image bmp et du texte
  ------------------------------------------------------------*/

#include <windows.h>
#include <stdio.h>
	
int k=0;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static CHAR szAppName[] ="Salut" ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;


	 wndclass.style         = NULL;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;

     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("Problème!"),szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     hwnd = CreateWindow (szAppName,                  // nom de la classe
                          "Réalité Virtuelle",		  // titre de la fenêtre
                           WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
									| WS_MINIMIZEBOX | WS_VISIBLE    ,   // style de la fenêtre
                          CW_USEDEFAULT,              // position initiale en x
                          CW_USEDEFAULT,              // position initiale en y
                          190,						  // largeur initiale
                          180,						  // hauteur initiale
                          NULL,                       // handle de la fenêtre mère
                          NULL,                       // handle du menu de la fenêtre
                          hInstance,                  // handle de l'instance
                          NULL) ;                     // paramètres de création
     
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
     
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HBITMAP hbitmap;		// pour le bitmap

     switch (message)
     {
   	 case WM_KEYDOWN:
		 switch(wParam)
		 {
			case VK_UP:
				// creation d'un rectangle
				RECT rect;
				rect.top=0;
				rect.left=20;
				rect.bottom=115;
				rect.right=52;
				// maintenant k change la valeur des couleurs des pixels 
				k+=50;
			    if(k>250) k=0;
				// on demande à redessiner la zone de rect avec un message WM_PAINT
				InvalidateRect(hwnd,&rect,FALSE);
				// c'est plus beau de ne pas effacer la zone avant de la redessiner
				// cela évite les clignotements
				break;
			case VK_ESCAPE:
				DestroyWindow(hwnd);
				break;
			default:
				break;
			
		 }
		 break;

	case WM_PAINT:
				HDC hdc;HDC hdcMemory;
				PAINTSTRUCT ps;
				hdc=BeginPaint(hwnd,&ps);	// obtient un handle de contexte de périphérique
			    
			
				// un peu de texte
				SetBkColor(hdc,RGB(0,0,255)); 
				SetTextColor(hdc,RGB(255,255,0)); 
				TextOut(hdc,10,3,"Texte ->",strlen("Texte ->"));

				char tab[20];
				SetTextAlign(hdc,TA_RIGHT | TA_TOP );
				SetBkColor(hdc,RGB(0,255,200)); 
				SetTextColor(hdc,RGB(255,0,0)); 
				TextOut(hdc,170,3,tab,sprintf(tab,"<- Texte")); // sprintf renvoit la longueur de la chaîne
				
				SetTextAlign(hdc,TA_LEFT | TA_TOP );
				SetBkColor(hdc,RGB(255,0,0)); 
				SetTextColor(hdc,RGB(30,30,30)); 
				TextOut(hdc,20,125,"Pressez flèche haut ",strlen("Pressez flèche haut "));

				// un bitmap
				
				BITMAP bm;
				hbitmap=(HBITMAP) LoadImage(NULL,"image.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
				hdcMemory=CreateCompatibleDC(NULL); 
				SelectObject(hdcMemory,hbitmap);
				GetObject(hbitmap,sizeof(bm),&bm);
				BitBlt(hdc,20,20,bm.bmWidth,bm.bmHeight,hdcMemory,0,0,SRCCOPY);
				// Zoom sur la partie supérieur droite
				StretchBlt(hdc,55,20,100,100,hdcMemory,16,16,16,16,SRCCOPY);

				DeleteDC(hdcMemory);

				

     

				// On affiche un petit pixel
				int i,j;
				for(j=0;j<=32;j++)
					for(i=0;i<=60;i++)
						SetPixel(hdc,20+j,55+i,RGB(i*4,j*4,k+4));
			
				EndPaint(hwnd,&ps); 	// libère un handle de contexte de périphérique
				break;

     case WM_DESTROY:
		  DeleteObject(hbitmap);	
          PostQuitMessage (0) ;
          return 0 ;
	
	 
     }
    return DefWindowProc (hwnd, message, wParam, lParam);

}