Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.45 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <windows.h>
  3. #include <math.h>
  4.  
  5. #define M_PI 3.14
  6.  
  7. #include <glut.h>
  8.  
  9.  
  10. LRESULT WINAPI WndProc(HWND, UINT, WPARAM, LPARAM);
  11.  
  12.  
  13. int main()
  14. {
  15.     //Получаем хендл приложения, потребуется при создании класса окна и самого окна.
  16.     HINSTANCE histance = GetModuleHandleW(NULL);
  17.  
  18.     //Создаем класс окна.
  19.     WNDCLASSEX wclass = { 0 };          //Обнуляем структуру с самого начала, так как заполнять будем не все поля.
  20.     wclass.cbSize = sizeof(WNDCLASSEX);      //По размеру структуры Windows определит, какая версия API была использована.
  21.     wclass.style = CS_HREDRAW | CS_VREDRAW;    //Говорим окну перерисовываться при изменении размеров окна.
  22.     wclass.lpfnWndProc = WndProc;        //Указываем функцию обработки сообщений.
  23.     wclass.hInstance = histance;        //Указываем хендл приложения.
  24.     wclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //GetStockObject возвращает хендл на белую кисточку, для фона окна
  25.     wclass.lpszClassName = "MYCLASS";      //Имя данного класса, должно быть уникальным, иначе, если класс с таким именем уже зарегестрирован, то в регистрации будет отказано.
  26.     //Регистрируем класс окна.
  27.     RegisterClassEx(&wclass);
  28.  
  29.     HWND w;
  30.  
  31.     //Создаем окно.
  32.     w = CreateWindowExW(
  33.         0,
  34.         L"MYCLASS",                //Имя класса.
  35.         L"Title",                //Заголовок окна.
  36.         WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, //WS_OVERLAPPEDWINDOW,          //Тип окна, влияет на отображение системного меню, кнопок в верхнем правом углу и т.п.
  37.         50, 50,                  //Координаты окна.
  38.         500, 500,                //Ширина окна.
  39.         0,                    //Ссылка на родительское окно.
  40.         0,                    //Хендл меню.
  41.         histance,                //Хендл приложения, получаем его функцией GetModuleHandleW.
  42.         0
  43.     );
  44.  
  45.     //Показываем окно, если этого не сделать окно не будет отображено.
  46.     ShowWindow(w, SW_SHOW);
  47.     //Обновляем окно.
  48.     UpdateWindow(w);
  49.  
  50.     //Запускаем цикл обработки сообщений окна.
  51.     MSG msg = { 0 };
  52.     while (GetMessage(&msg, 0, 0, 0)) {
  53.         TranslateMessage(&msg);  //Преобразуем виртуальную клавишу в ASCII-код и посылаем сообщение WM_CHAR (тут не нужно.Необходимо, если надо работать с текстом, вводимым с клавиатуры)
  54.         DispatchMessage(&msg);  //Передаем сообщения для обработки в "главную функцию обработки сообщений"
  55.     }
  56.     return 0;
  57. }
  58.  
  59. LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  60. {
  61.     switch (msg) {
  62.     case WM_DESTROY:// если этого не сделать, то все ваши жалкие попытки закрыть окно будут проигнорированы
  63.         wglMakeCurrent(0, 0);
  64.         wglDeleteContext(wglGetCurrentContext());
  65.         ReleaseDC(hWnd, wglGetCurrentDC());
  66.         PostQuitMessage(0);// отправляет приложению сообщение WM_QUIT. Принимает код ошибки, который заносится в wParam сообщения WM_QUIT
  67.         break;
  68.  
  69.  
  70.     case WM_CREATE:
  71.         HGLRC RC;
  72.         HDC   DC;
  73.         PIXELFORMATDESCRIPTOR pfd, *ppfd;
  74.  
  75.         wglMakeCurrent(0, 0);
  76.         int pixelformat;
  77.         ppfd = &pfd;
  78.         ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
  79.         ppfd->nVersion = 1;
  80.         ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  81.         ppfd->dwLayerMask = PFD_MAIN_PLANE;
  82.         ppfd->iPixelType = PFD_TYPE_RGBA;
  83.         ppfd->cColorBits = 16;
  84.         ppfd->cDepthBits = 16;
  85.         ppfd->cAccumBits = 0;
  86.         ppfd->cStencilBits = 0;
  87.  
  88.         DC = GetDC(hWnd);       //1
  89.  
  90.         pixelformat = ChoosePixelFormat(DC, ppfd); //2
  91.         SetPixelFormat(DC, pixelformat, ppfd);              //3
  92.         RC = wglCreateContext(DC); //4
  93.         wglMakeCurrent(DC, RC);     //5
  94.  
  95.  
  96.         break;
  97.  
  98.     case WM_SIZE:
  99.         // при изменении размеров формы необходимо правильно
  100.         // установить область вывода OpenGL
  101.         WORD w, h;
  102.         w = LOWORD(lParam);
  103.         h = HIWORD(lParam);
  104.         glViewport(0, 0, w, h);
  105.         break;
  106.  
  107.     case WM_PAINT:
  108.         int i;
  109.         GLfloat x, y;
  110.         glClearColor(0.0, 0.0, 0.25, 0.0);
  111.         glClear(GL_COLOR_BUFFER_BIT);
  112.  
  113.         glPointSize(10.0);
  114.         for (i = 0; i <= 12; i++)
  115.         {
  116.             if(i == 3 || i == 6 || i == 9 || i == 12) glColor3f(1.0, 0.0, 0.0); else glColor3f(1.0, 1.0, 1.0);
  117.             glBegin(GL_POINTS);
  118.             x = 0.8 * cos(i * 2 * M_PI / 12);
  119.             y = 0.8 * sin(i * 2 * M_PI / 12);
  120.             glVertex2f(x, y);
  121.             glEnd();
  122.         }
  123.         glBegin(GL_LINES);
  124.         glVertex2f(0.0, 6.28);
  125.         glVertex2f(0.0, 0.0);
  126.         glEnd();
  127.  
  128.         SwapBuffers(wglGetCurrentDC());
  129.         break;
  130.     }
  131.     return DefWindowProc(hWnd, msg, wParam, lParam);//обрабатываем все остальные сообщения обработчиком "по умолчанию"
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement