Advertisement
Gireada

OpenGL Win32

May 7th, 2018
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.78 KB | None | 0 0
  1. //Program sablon - pt. Win32
  2.  
  3. #include <windows.h>
  4. #include <windowsx.h>
  5. #include <gl\glos.h>
  6. #include <gl/gl.h>
  7. #include <gl/glu.h>
  8. #include <gl/glaux.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11.  
  12. static int mmx,mmy,unghi_,a_,b_;
  13. static HGLRC hRC;              
  14. static HDC hDC;                
  15. static GLfloat nRange=100.0f;
  16. double x=0.1,y=0.1;
  17. int lx=25,ly=30;
  18. // se seteaza formatul punctului adica - caracteristicile
  19. //mediului grafic folosit de OpenGL
  20. void SetDCPixelFormat(HDC hDC)
  21.         {
  22.         int nPixelFormat;
  23.         static PIXELFORMATDESCRIPTOR pfd = {
  24.                 sizeof(PIXELFORMATDESCRIPTOR),  // Dimensiunea structurii PIXELFORMAT...
  25.                 1,                              // Versiunea acestei structuri
  26.                 PFD_DRAW_TO_WINDOW |             // Deseneaza in fereastra si nu intr-un bitmap
  27.                 PFD_SUPPORT_OPENGL |            // Fereastra compatibila cu OpenGL
  28.                 PFD_DOUBLEBUFFER,               // Se foloseste modul dublu-buffer
  29.                 PFD_TYPE_RGBA,                  // Culoare punctului respecta standardul RGBA
  30.                 24,                             // Culoare este pastrate pe 24 de biti
  31.                 0,0,0,0,0,0,                    // nespecificati
  32.                 0,0,                            // nespecificati
  33.                 0,0,0,0,0,                      // nespecificati
  34.                 32,                             // Precizia bufferului de adancime
  35.                 0,                              // nespecificat
  36.                 0,                              // nespecificat
  37.                 PFD_MAIN_PLANE,                 // Deseneaza in planul principal
  38.                 0,                              // nespecificat
  39.                 0,0,0 };                   // nespecificati
  40.  
  41.          // Se alege formatul punctului,cel mai apropiat de setarile din -pfd-
  42.          nPixelFormat = ChoosePixelFormat(hDC, &pfd);
  43.          // Se precizeaza formatul punctului
  44.          SetPixelFormat(hDC, nPixelFormat, &pfd);
  45.          }
  46. GLsizei width0=800,height0=800;
  47. GLint etapa=0,a=0,b=0,contor=0;
  48. int roteste_on=0;
  49. //functia principala de desenare
  50. //orice se doreste a fi desenat prin OpenGL se introduce in corpul acestei functii
  51. void CALLBACK deseneaza(void)
  52. {
  53.    
  54.     glClearColor(0.0f,0.0f,0.0f,1.0f);
  55.     glClear(GL_COLOR_BUFFER_BIT);
  56.     glRecti(x,y,x+lx,y+ly);
  57.     //introduceti aici codul pentru desenarea unei scene
  58.     glFlush();
  59.    
  60.  
  61. }
  62. //functia care este apelata la redimensionarea ferestrei
  63. void CALLBACK resizefunc(GLsizei w,GLsizei h)
  64. {
  65.     if (w==0)   w=1;
  66.     if (h==0)   h=1;
  67.     glViewport(0,0,w,h);
  68.     glMatrixMode(GL_PROJECTION);
  69.     glLoadIdentity();
  70.     GLsizei w2,h2;
  71.     if (w>h){
  72.         w2=nRange*w/h;
  73.         h2=nRange; 
  74.     }else
  75.     {
  76.         w2=nRange;
  77.         h2=nRange*h/w; 
  78.     }
  79.     glOrtho(-w2,w2,-h2,h2,-nRange,nRange);
  80.     glMatrixMode(GL_MODELVIEW);
  81.         glLoadIdentity();
  82.  
  83. }
  84. void CALLBACK ActiuneStanga(void)
  85. {
  86.     // se introduce codul care se doreste a fi apelat
  87.     // la apasarea tastei spre stanga
  88.    
  89. }
  90. void CALLBACK ActiuneDreapta(void)
  91. {
  92.     // se introduce codul care se doreste a fi apelat
  93.     // la apasarea tastei spre dreapta
  94.    
  95. }
  96. void CALLBACK ActiuneSus(void)
  97. {
  98.     // se introduce codul care se doreste a fi apelat
  99.     // la apasarea tastei in sus
  100.    
  101. }
  102. void CALLBACK ActiuneJos(void)
  103. {
  104.     // se introduce codul care se doreste a fi apelat
  105.     // la apasarea tastei in jos
  106.    
  107. }
  108. void CALLBACK ActiuneBaraDeSpatiu(void)
  109. {
  110.     // se introduce codul care se doreste a fi apelat
  111.     // la apasarea tastei bara de spatiu
  112.    
  113. }
  114.  
  115. // functie ce se repeta in permanenta la un interval de timp
  116. // precis definit
  117. void CALLBACK Repeta(void)
  118. {
  119.     //se introduce codul care se doreste a fi repetat la intervale periodice
  120. }
  121. //Corpul functie pentru procesare mesajelor de sistem
  122.  
  123. LRESULT CALLBACK WndProc(                        
  124.                          HWND    hWnd, // fereastra care primeste mesajul
  125.                          UINT    message,//codul mesajului
  126.                          WPARAM  wParam,// primul parametru al mesajului
  127.                          LPARAM  lParam // al doilea parametru al mesajului
  128.                          )
  129.         {
  130.        
  131.         switch (message)
  132.                   {
  133.                   // mesaj trimis la crearea ferestrei
  134.                   case WM_CREATE:
  135.                           // salvam dispozitivul de context al ferestrei in hDC
  136.                           hDC = GetDC(hWnd);          
  137.  
  138.                           // stabilim formatul punctului
  139.                           SetDCPixelFormat(hDC);          
  140.  
  141.                           // creem un dispozitiv de context de prelucrare OpenGL -hRC- compatibil
  142.                           // cu dispozitivul de context al ferestrei curente -hDC-
  143.                           hRC = wglCreateContext(hDC);
  144.                           // asociem,legam, interconectam dispozitivul OpenGL -hRC-
  145.                           // cu dispozitivul ferestrei -hDC-
  146.                           wglMakeCurrent(hDC, hRC);
  147.  
  148.                           // creem o temporizare care genereaza un mesaj de temporizare
  149.                           // la fiecare 5 ms
  150.                           SetTimer( hWnd, // fereastra careia ii asociem temporizarea
  151.                                     10000,// codul temporizarii
  152.                                     5,// valoare intervalului de temporizare in milisecunde
  153.                                     NULL // nefolosit
  154.                                     );
  155.                           break;
  156.  
  157.         // mesaj trimis la inchiderea ferestrei
  158.         case WM_DESTROY:
  159.                 // dezactivam temporizarea
  160.                 KillTimer(hWnd,101);
  161.  
  162.                 // deselectam, dezasociem dispozitivul de context al ferestrei
  163.                 // fata de dispozitivul de prelucrare OpenGL prin resetare lui cu NULL
  164.                 wglMakeCurrent(hDC,NULL);
  165.  
  166.  
  167.                 // stergem dispozitivul de prelucrare OpenGL
  168.                 wglDeleteContext(hRC);                
  169.  
  170.                 // Incheiem aplicatia dupa ce fereastra este inchisa
  171.                 PostQuitMessage(0);
  172.                 break;
  173.  
  174.         // mesaj trimis la redimensionarea ferestrei
  175.         case WM_SIZE:
  176.                 // trimitem spre prelucrare parametrii mesajului functiei
  177.                 // de redimensionare a ferestrei
  178.                 resizefunc(
  179.                              LOWORD(lParam), // lungimea ferestrei
  180.                              HIWORD(lParam) // inaltimea ferestrei
  181.                         );
  182.                 break;
  183.  
  184.         // mesaj trimis la atingerea momentului precizat de temporizare
  185.         case WM_TIMER:
  186.                 {
  187.                 // functie de prelucrare repetitiva
  188.                 Repeta();
  189.                 // comanda de redesenare a ferestrei
  190.                 InvalidateRect(hWnd,NULL,FALSE);
  191.                 }
  192.                 break;
  193.  
  194.         // mesaj trimis la desenarea ferestrei
  195.         case WM_PAINT:
  196.                 {
  197.                 // functia de desenare
  198.                 deseneaza();
  199.                  
  200.                 // copiem din bufferul de dispozitiv al OpenGL in bufferul
  201.                 // de dispozitiv al ferestrei
  202.                 SwapBuffers(hDC);
  203.                // verificam fereastra
  204.                ValidateRect(hWnd,NULL);
  205.                }
  206.                break;
  207.         // mesaj trimis la apasare unei taste
  208.         case WM_KEYDOWN:
  209.             {
  210. //           char s[100];
  211.              long keydata;
  212.              keydata=(lParam & 0xFF0000)/0x10000;
  213.              switch (keydata)
  214.              {
  215.             case 75://tasta spre stanga
  216.                 ActiuneStanga();
  217.                 break;
  218.             case 77://tasta spre dreapta
  219.                 ActiuneDreapta();
  220.                 break;
  221.             case 72://tasta in sus
  222.                 ActiuneSus();
  223.                 break;
  224.             case 80://tasta in jos
  225.                 ActiuneJos();
  226.                 break;
  227.             case 57://tasta bara de spatiu
  228.                 ActiuneBaraDeSpatiu();
  229.                 break;
  230.              }
  231.  
  232.             }
  233.             break;
  234.           // mesaj trimis la miscarea pointerului de mouse
  235.         case WM_MOUSEMOVE:
  236.             {
  237.               int mx,my;
  238.               mx=LOWORD(lParam);// coordonata pe x a pointerului
  239.               my=HIWORD(lParam);// coordonata pe y a pointerului
  240.               // detectare tinerii apasate a butonului de mouse stang in timpul miscarii pointerului
  241.              
  242.               if (wParam==MK_LBUTTON)
  243.               {
  244.                   //a=a_+(mmy-y)*2;
  245.                   //b=b_+(mmx-x)*2;
  246.                   x=mx-300;
  247.                   y=300-my;
  248.                   deseneaza();
  249.               }
  250.             }break;
  251.           // mesaj trimis la apasarea butonul stang al mouse-ului
  252.         case WM_LBUTTONDOWN:
  253.                            
  254.             {
  255.               int mx,my;
  256.               mx=LOWORD(lParam);
  257.               my=HIWORD(lParam);
  258.               a_=a;
  259.               b_=b;
  260.               mmx=x+mx;
  261.               mmy=y+my;
  262.             }
  263.             break;
  264.         // mesaj trimis la apasarea butonul drept al mouse-ului
  265.         case WM_RBUTTONDOWN:
  266.             {
  267.                
  268.             }
  269.             break;
  270.        // mesaj trimis la apasarea butonul din mijloc al mouse-ului
  271.         case WM_MBUTTONDOWN:
  272.             {
  273.                
  274.             }
  275.             break;
  276.        
  277.  
  278.        default:   // orice mesaj neprocesat este recirculat
  279.                   // prin comportamentul functiei de tratare implicita a mesajelor
  280.     return (DefWindowProc(hWnd, message, wParam, lParam));
  281.  
  282.        }
  283. return (0L);
  284. }
  285. //titlul ferestrei
  286. char windowtitle[]="Aplicatie OpenGL in Win32";
  287.  
  288. // functia pricipala a programului
  289. int APIENTRY WinMain(  
  290.                        HINSTANCE       hInstance, // instanta programului
  291.                        HINSTANCE       hPrevInstance,//instanta precedenta de program
  292.                        LPSTR           lpCmdLine,// sirul de carctere scris la linia de comanda
  293.                        int             nCmdShow)
  294.        {
  295.         MSG            msg;            // mesaj windows standard
  296.         WNDCLASS       wc;             // clasa de ferestre windows
  297.         HWND           hWnd;           // fereastra windows standard
  298.            // Specificare parametrilor obiectului de fereastra
  299.         wc.style               = CS_HREDRAW | CS_VREDRAW;
  300.         wc.lpfnWndProc         = (WNDPROC) WndProc;
  301.         wc.cbClsExtra          = 0;
  302.         wc.cbWndExtra          = 0;
  303.         wc.hInstance           = hInstance;
  304.         wc.hIcon               = NULL;
  305.         wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
  306.         wc.hbrBackground       = NULL;          
  307.         wc.lpszMenuName        = NULL;
  308.         wc.lpszClassName       =(LPCTSTR)windowtitle;
  309.  
  310.         // Inregistrare ferestrei in sistemul de operare
  311.         if(RegisterClass(&wc) == 0)
  312.                 return FALSE;
  313.         // Crearea ferestrei principale a aplicatiei
  314.            hWnd = CreateWindow(                      
  315.                     (LPCTSTR)windowtitle,
  316.                        (LPCTSTR)windowtitle,
  317.                        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
  318.                        100, 100,
  319.                        width0, height0,
  320.                        NULL,
  321.                        NULL,
  322.                        hInstance,
  323.                        NULL);
  324.         // daca fereastra nu a fost creata se iese
  325.         if(hWnd == NULL)
  326.                 return FALSE;
  327.  
  328.         // se afiseaza fereastra creata
  329.         ShowWindow(hWnd,SW_SHOW);
  330.         // se actualizeaza continutul ferestrei
  331.         UpdateWindow(hWnd);
  332.  
  333.         // se proceseaza mesajele catre fereastra intr-o bucla
  334.         while( GetMessage(&msg, NULL, 0, 0))
  335.                 {
  336.                 TranslateMessage(&msg);
  337.                 DispatchMessage(&msg);
  338.                 }
  339.         return msg.wParam;
  340.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement