#include "servgl.h"#include <QMessageBox.h>HINSTANCE hInst;static HGLRC hRC; // Постоянный контекст рендерингаstatic HDC hDC; // Приватный контекст устройства GDIbool RegisterClass(HINSTANCE hInstance);ServGL::ServGL(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags){ setupUi(this); connect(crWinGL, SIGNAL(clicked()), SLOT(slotCreateWindowGL())); hInst = GetModuleHandle(NULL); RegisterClass(hInst); }ServGL::~ServGL(){}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ GLuint PixelFormat; PAINTSTRUCT ps; static PIXELFORMATDESCRIPTOR pfd= { sizeof(PIXELFORMATDESCRIPTOR), // Размер этой структуры 1, // Номер версии (?) PFD_DRAW_TO_WINDOW |// Формат для Окна PFD_SUPPORT_OPENGL |// Формат для OpenGL PFD_DOUBLEBUFFER,// Формат для двойного буфера PFD_TYPE_RGBA, // Требуется RGBA формат 32, // Выбор 16 бит глубины цвета 0, 0, 0, 0, 0, 0,// Игнорирование цветовых битов (?) 0, // нет буфера прозрачности 0, // Сдвиговый бит игнорируется (?) 0, // Нет буфера аккумуляции 0, 0, 0, 0, // Биты аккумуляции игнорируются (?) 32, // 16 битный Z-буфер (буфер глубины) 0, // Нет буфера траффарета 0, // Нет вспомогательных буферов (?) PFD_MAIN_PLANE, // Главный слой рисования 0, // Резерв (?) 0, 0, 0 // Маски слоя игнорируются (?) }; switch (message) // Тип сообщения { case WM_CREATE: hDC = GetDC(hWnd); // Получить контекст устройства для окна PixelFormat = ChoosePixelFormat(hDC, &pfd); // Найти ближайшее совпадение для нашего формата пикселов if (!PixelFormat) { MessageBox(0,TEXT("Can't Find A Suitable PixelFormat."),TEXT("Error"),MB_OK|MB_ICONERROR); PostQuitMessage(0); // Это сообщение говорит, что программа должна завершится break; // Предтовращение повтора кода } if(!SetPixelFormat(hDC,PixelFormat,&pfd)) { MessageBox(0,TEXT("Can't Set The PixelFormat."),TEXT("Error"),MB_OK|MB_ICONERROR); PostQuitMessage(0); break; } hRC = wglCreateContext(hDC); if(!hRC) { MessageBox(0,TEXT("Can't Create A GL Rendering Context."),TEXT("Error"),MB_OK|MB_ICONERROR); PostQuitMessage(0); break; } if(!wglMakeCurrent(hDC, hRC)) { MessageBox(0,TEXT("Can't activate GLRC."),TEXT("Error"),MB_OK|MB_ICONERROR); PostQuitMessage(0); break; } InitGL(); paintGL(); SwapBuffers( hDC ); // Меняем буфер (двойная буферизация) break; case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: // break; default: return (DefWindowProc(hWnd, message, wParam, lParam)); } return (0);}bool RegisterClass(HINSTANCE hInstance){ WNDCLASS wc; // Структура класса Windows для установки типа окна wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = NULL; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+2); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("OpenGL WinClass"); if(!RegisterClass(&wc)) { MessageBox(0,TEXT("Failed To Register The Window Class."),TEXT("Error"),MB_OK|MB_ICONERROR); return false; } return true;}bool ServGL::slotCreateWindowGL(){ MSG msg; // Структура сообщения Windows HWND hWnd; // Сохранение дискриптора окна hWnd = CreateWindow(TEXT("OpenGL WinClass"), TEXT("OpenGL"), // Заголовок вверху окна WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME, 200, 200, // Позиция окна на экране 640, 480, // Ширина и высота окна NULL, NULL, hInst, NULL ); if(!hWnd) { MessageBox(0,TEXT("Window Creation Error."),TEXT("Error"),MB_OK | MB_ICONERROR); } ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); SetFocus(hWnd); while (1) { // Обработка всех сообщений while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { if (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { return true; } } }}