Каркас оконного OpenGL приложения на примере вращающегося куба
Данное приложение изначально создавалось как курсовая работа на 3 курсе,
использует библиотеки opengl32.lib и glu32.lib. Данный код - пример
заведомо рабочего приложения OpenGL и ничего более.
// Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING];
static HWND hWnd, hdwnd, hownd; // The title bar text static HDC hdc; static HGLRC hRC; // Это контекст рендеринга BOOL keys[256]; // это массивчик, который нам пригодится // для обработки нажатия клавиш GLfloat Trot; GLfloat Qrot;
float ro=0,x=0,y=0,z=0,ug=0;
GLvoid Initial(GLsizei Width, GLsizei Height); // по названию ясно, это инициализация всей страны (т.е. OpenGL)
GLvoid Resize(GLsizei Width, GLsizei Height); // эта маленькая функция будет вызываться при получении окном сообщения WM_SIZE
GLvoid Draw(GLvoid); // это центр вселенной для OpenGL
// Foward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc1(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; // HACCEL hAccelTable;
// // FUNCTION: MyRegisterClass() // // PURPOSE: Registers the window class. // // COMMENTS: // // This function and its usage is only necessary if you want this code // to be compatible with Win32 systems prior to the 'RegisterClassEx' // function that was added to Windows 95. It is important to call this function // so that the application will get 'well formed' small icons associated // with it. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex;
// // FUNCTION: InitInstance(HANDLE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
hInst = hInstance; // Store instance handle in our global variable
// // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam) { // int wmId, wmEvent; // PAINTSTRUCT ps;
RECT Screen; // Это структурка в которую мы поместим размеры области экрана GLuint PixelFormat; // формат пикселя
static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR),// размер структуры 1, // версия ? PFD_DRAW_TO_WINDOW| // format must support Window PFD_SUPPORT_OPENGL| // format must support OpenGL PFD_DOUBLEBUFFER, // must support double buffer PFD_TYPE_RGBA, // требуется RGBA формат 16, // 16Bit color depth 0, 0, 0, 0, 0, 0, // Color bits ignored ? 0, // No Alpha buffer 0, // shift bit ignored 0, // no accumulation buffer 0, 0, 0, 0, // accumulation buffer bits ignored 16, // 16bit z-buffer (depth buffer) 0, // no stencil buffer 0, // no auxiliary buffer PFD_MAIN_PLANE, // main drawing layer 0, // reserved 0, 0, 0 // layer mask ignored };
switch (message) { /*case WM_COMMAND: { switch (LOWORD (wParam)) case ID_32771: CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About); break; //DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About); break; } break;*/ case WM_CREATE: // на этапе создания приложения мы должны настроить // формат пикселей и инициализироваит библиотеку hdc = GetDC(hwnd2); // получаем контекст windows
// Следующие несколько строк настраивают формат пикселей PixelFormat = ChoosePixelFormat(hdc, &pfd);
GetClientRect(hwnd2, &Screen); // получаем клиентскую область Initial(Screen.right, Screen.bottom);// инициализация OpenGL break; case WM_CLOSE: case WM_DESTROY: // по CLOSE и/или DESTROY ChangeDisplaySettings(NULL, 0); // восстанавливаем установки
PostQuitMessage(0); break; case WM_SIZE: // ну это для resize ( хотя как сделать resize // для fuulscreen application я не знаю ;) ) Resize(LOWORD(lParam), HIWORD(lParam)); break; default: return( DefWindowProc(hwnd2, message, wParam, lParam)); } return(0);
} //char *str = new char; char str[20]; // Mesage handler for about box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { str[0] = '0'; switch (message) { case WM_INITDIALOG: return TRUE;
case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } switch (LOWORD(wParam)) { case IDC_ROTATION: { SendMessage(GetDlgItem(hdwnd, IDC_EDIT1),EM_GETLINE,0,(LPARAM)str); x = atof(str); //x = (int)str - (int)'0'; SendMessage(GetDlgItem (hdwnd, IDC_EDIT2),EM_GETLINE,0,(LPARAM)str); y = atof(str); //y = (int)str - (int)'0'; SendMessage(GetDlgItem (hdwnd, IDC_EDIT3),EM_GETLINE,0,(LPARAM)str); z = atof(str); //z = (int)str - (int)'0'; ro = 1; } break; case IDC_ROTED: {} break; case IDC_STOP: ro = 0; break; } break; } return FALSE; }
GLvoid Initial(GLsizei Width, GLsizei Height) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// устанавливаем цвет для очистки буфера цвета glClearDepth(1.0); // устенавливаем параметр для очистки буфера глубины glDepthFunc(GL_LESS); // настройка Z буфера glEnable(GL_DEPTH_TEST); // и, наконец, включение
glShadeModel(GL_SMOOTH); // выбираете режим затенения ( flat или smooth )
glMatrixMode(GL_PROJECTION);// устанавливаем текушей матрицей матрицу проекта glLoadIdentity(); // обнуляем эту самую матрицу
// настраиваем перспективу ( вот она, функция из glu32 ) gluPerspective(45.0f, (GLfloat)Width / (GLfloat)Height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); // и переключаемся в модельную матрицу }
glEnd(); if (ug) {Trot = ug/100; ug = 0;} else Trot += 0.3f * ro; }
////////////////////////////////////////////////////////////////////// wina.h /////////////////////////////////////////////////////////////////////// #pragma once
// Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_WINA ICON "wina.ico" IDI_SMALL ICON "small.ico"