#include #include #include #include #include "GLContext.h" #include "imagePGM.h" using namespace std; #define WIN32_LEAN_AND_MEAN GLContext *fenetreGL; imagePGM *image; void Reshape (int width, int height) { glMatrixMode (GL_PROJECTION); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glViewport (0, 0, width, height); gluOrtho2D (0, width, 0, height); } void Display (void) { glClear (GL_COLOR_BUFFER_BIT); glPushMatrix (); glRasterPos2i (0, 0); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); glDrawPixels (image->getWidth (), image->getHeight (), GL_LUMINANCE, GL_UNSIGNED_BYTE, image->dataGL); glPopMatrix (); SwapBuffers(fenetreGL->getHDC ()); glFlush (); } LRESULT WINAPI CallBack (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch (msg) { case WM_KEYDOWN: // Touche enfoncée switch (wParam) { case VK_ESCAPE: // Touche espace PostQuitMessage(0); // Provoque la sortie de la boucle des messages. (WM_QUIT pour fin programme) break; } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_CLOSE: wglMakeCurrent (NULL, NULL); if (fenetreGL->getHGLRC ()) { wglDeleteContext (fenetreGL->getHGLRC ()); } ReleaseDC (hwnd, fenetreGL->getHDC ()); DestroyWindow (hwnd); break; case WM_SIZE: Reshape (LOWORD (lParam), HIWORD (lParam)); break; case WM_PAINT: Display (); break; default: break; } return DefWindowProc( hwnd, msg, wParam, lParam ); // Message traité, ok pour suivant } int __stdcall WinMain ( HINSTANCE hInst, // Handle de l'instance de l'application HINSTANCE hpInst, // Toujours NULL mais Handle sur l'instance precedente LPSTR CmdLine, // Liste de argument passé lors de l'appelle du programme int CmdShow) // Flag indiquant comment la fenetr sera affiché lors de sa création { WNDCLASSEX winClass; // Objet fenetre HWND hwnd; // Handle de la fenetre MSG msg; // Message (event) float theta = 0.0f; cout << "ok la sa marcher\n"; image = new imagePGM ("lena.pgm"); image->rockImage (); ZeroMemory (&msg, sizeof (msg)); // Initialisation de msg winClass.lpszClassName = "MAIN_WINDOW"; // Nom de cette objet winClass.cbSize = sizeof(WNDCLASSEX); // Taille de l'objet en byte winClass.style = CS_HREDRAW | CS_VREDRAW; // Style de la fenetre winClass.lpfnWndProc = CallBack; // Fonction appelée pour les callback winClass.hInstance = hInst; // Instance of this application winClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Icone winClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // Petit icone winClass.hCursor = LoadCursor(NULL, IDC_ARROW); // Curseur de la sourie, ici par defaut winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // Remplissage du fond de la fenetre winClass.lpszMenuName = NULL; // Nom de la ressource menu winClass.cbClsExtra = 0; // Nombre d'octet en plus pour la structure winClass.cbWndExtra = 0; // Nombre d'octet en plus pour l'instance if (RegisterClassEx (&winClass) == 0) // Enregistrement des propriétés de la fenetre { return E_FAIL; } // Création de la fenetre hwnd = CreateWindow ( winClass.lpszClassName, // Nom de l'objet fenetre a créer "Nom de la fenetre", // Nom apparaissant sur la fenetre WS_OVERLAPPEDWINDOW | WS_VISIBLE, // Style de la fenetre 0, 0, // Position initiale de la fenetre sur l'ecran image->getWidth () + 8, image->getHeight () + 34, // Taille initiale de la fenetre NULL, // Handle de la fenetre parent NULL, // Handle du menu hInst, // Handle de l'instance de cette application NULL); // Parametre suplementaire pour la fenetre if (hwnd == NULL) { return E_FAIL; } fenetreGL = new GLContext (hwnd); // Affichage de la fenetre ShowWindow ( hwnd, // Handle de la fenetre CmdShow); // Flag de commande d'affichage // Mise a jour de son contenu UpdateWindow (hwnd); Reshape (image->getWidth () + 8, image->getHeight () + 34); // Boucle principale de la fenetre while (msg.message != WM_QUIT) { if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { //GetMessage (&msg, NULL, 0U, 0U); // Lit un message dans la file et retourne TRUE si elle n'est pas vide TranslateMessage( &msg); // Transcription du message DispatchMessage( &msg); // transmet le message à la fonction des callbacks (lpfnWndProc) } else { // OpenGL animation code goes here Display (); } } fenetreGL->purge (); return 0; }