| Статистика |
 |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |  |
 |
|
 | |  |
|
Каркас оконного OpenGL приложения на примере вращающегося куба
Данное приложение изначально создавалось как курсовая работа на 3 курсе,
использует библиотеки opengl32.lib и glu32.lib. Данный код - пример
заведомо рабочего приложения OpenGL и ничего более.
wina.cpp /////////////////////////////////////////////////////////////////////////////////////////
/// wina.cpp : Defines the entry point for the application. //
#include "stdafx.h" #include "resource.h" #include <gl/gl.h> // OpenGL #include <gl/glu.h> // GLU
#define MAX_LOADSTRING 100
// 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;
// Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_WINA, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance);
// Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } DEVMODE dmScreenSettings;
memset(&dmScreenSettings, 0, sizeof(DEVMODE)); dmScreenSettings.dmSize = sizeof(DEVMODE); dmScreenSettings.dmPelsWidth = 1024; dmScreenSettings.dmPelsHeight = 768; dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; ChangeDisplaySettings(&dmScreenSettings, WS_OVERLAPPEDWINDOW );
ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); hdwnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About); //hownd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, (DLGPROC)WndProc1); 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; } } Draw(); SwapBuffers(hdc); if(keys[VK_ESCAPE]) SendMessage(hWnd, WM_CLOSE, 0, 0); }
return msg.wParam; }
// // 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;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_WINA); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCWSTR)IDC_WINA; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&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
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 0, 0, 1024, 768, NULL, NULL, hInstance, NULL);
if (!hWnd) { return FALSE; }
//ShowWindow(hWnd, nCmdShow); //UpdateWindow(hWnd);
return TRUE; }
// // 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);
if(!PixelFormat){ MessageBox(0, (LPCWSTR)"Can't find suitable PixelFormat", (LPCWSTR)"Error", MB_OK|MB_ICONERROR); PostQuitMessage(0); break; }
if(!SetPixelFormat(hdc, PixelFormat, &pfd)) { MessageBox(0, (LPCWSTR)"Can't set The PixelFormat", (LPCWSTR)"Error", MB_OK|MB_ICONERROR); PostQuitMessage(0); break; } hRC = wglCreateContext(hdc); // создаем контекст рендеринга if(!hRC) { MessageBox(0, (LPCWSTR)"Can't Create Render Device Context", (LPCWSTR)"Error",MB_OK|MB_ICONERROR); PostQuitMessage(0); break; } if(!wglMakeCurrent(hdc, hRC)) { // устанавливаем его текущим MessageBox(0, (LPCWSTR)"Can't set current Render Device Context", (LPCWSTR)"Error",MB_OK|MB_ICONERROR); PostQuitMessage(0); break; }
GetClientRect(hwnd2, &Screen); // получаем клиентскую область Initial(Screen.right, Screen.bottom);// инициализация OpenGL break; case WM_CLOSE: case WM_DESTROY: // по CLOSE и/или DESTROY ChangeDisplaySettings(NULL, 0); // восстанавливаем установки
wglMakeCurrent(hdc, NULL); // устанавливаем обычный device context wglDeleteContext(hRC); // удаляем контекст рендеринга ReleaseDC(hwnd2, hdc); // освобождаем device context
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); // и переключаемся в модельную матрицу }
GLvoid Resize(GLsizei Width, GLsizei Height) { if(Height==0) Height = 1; glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
gluPerspective(45.0f, (GLfloat)Width / (GLfloat)Height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW); }
GLvoid Draw(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f); glRotatef(Trot, x, y, z); glBegin(GL_LINE_STRIP); glColor3f(0.0f,1.0f,0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glVertex3f( -1.0f, -1.0f, 1.0f); glVertex3f( -1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glEnd(); glBegin(GL_LINE_STRIP); glColor3f(1.0f,0.5f,0.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glVertex3f( -1.0f, -1.0f, -1.0f); glVertex3f( -1.0f, 1.0f, -1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glEnd(); glBegin(GL_LINE_STRIP); glColor3f(1.0f,0.0f,0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glEnd(); glBegin(GL_LINE_STRIP); glColor3f(1.0f,1.0f,0.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glVertex3f(1.0f,-1.0f,-1.0f); glEnd(); glBegin(GL_LINE_STRIP); glColor3f(0.0f,0.0f,1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glEnd(); glBegin(GL_LINE_STRIP); glColor3f(1.0f,0.0f,1.0f); glVertex3f( -1.0f, -1.0f, 1.0f); glVertex3f( -1.0f, -1.0f, -1.0f); glEnd(); glEnd(); if (ug) {Trot = ug/100; ug = 0;} else Trot += 0.3f * ro; }
////////////////////////////////////////////////////////////////////// wina.h /////////////////////////////////////////////////////////////////////// #pragma once
#include "resource.h"
///////////////////////////////////////////////////////////////////// Resource.h //////////////////////////////////////////////////////////////////// //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by wina.rc // #define IDC_MYICON 2 #define IDD_WINA_DIALOG 102 #define IDS_APP_TITLE 103 #define IDD_ABOUTBOX 103 #define IDM_ABOUT 104 #define IDD_ABOUTBOX1 104 #define IDM_EXIT 105 #define IDI_WINA 107 #define IDI_SMALL 108 #define IDC_WINA 109 #define IDR_MAINFRAME 128 #define IDD_DIALOG1 129 #define IDC_EDIT1 1000 #define IDC_EDIT2 1001 #define IDC_EDIT3 1002 #define IDC_ROTATION 1003 #define IDC_ROTED 1004 #define IDC_BUTTON3 1005 #define IDC_STOP 1005 #define IDC_BUTTON4 1006 #define IDC_BUTTON5 1007 #define ID_32771 32771 #define IDC_STATIC -1
// Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 130 #define _APS_NEXT_COMMAND_VALUE 32772 #define _APS_NEXT_CONTROL_VALUE 1008 #define _APS_NEXT_SYMED_VALUE 110 #endif #endif
////////////////////////////////////////////////////////////////////////// wina.rc /////////////////////////////////////////////////////////////////////////// // Microsoft Visual C++ generated resource script. // #include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #ifndef APSTUDIO_INVOKED #include "targetver.h" #endif #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS
///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS
///////////////////////////////////////////////////////////////////////////// // Russian resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) #ifdef _WIN32 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT #pragma code_page(1251) #endif //_WIN32
///////////////////////////////////////////////////////////////////////////// // // Menu //
IDC_WINA MENU BEGIN POPUP "Файл" BEGIN MENUITEM "E&xit", IDM_EXIT MENUITEM "Меню", ID_32771 END END
///////////////////////////////////////////////////////////////////////////// // // Dialog //
IDD_ABOUTBOX DIALOGEX 0, 0, 233, 161 STYLE DS_ABSALIGN | DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_SYSMENU FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "made by robesh",IDC_STATIC,9,111,133,8,SS_NOPREFIX LTEXT "Copyright (C) 2011",IDC_STATIC,7,137,114,8 EDITTEXT IDC_EDIT1,33,18,102,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,33,33,102,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,33,49,100,12,ES_AUTOHSCROLL PUSHBUTTON "Вращение",IDC_ROTATION,36,68,71,17 PUSHBUTTON "Стоп",IDC_STOP,38,88,66,16 END
IDD_ABOUTBOX1 DIALOGEX 0, 0, 343, 179 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "About wina" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "Вращение куба Беженцев Р.В. 8ВТб-1",IDC_STATIC,7,152,133,8,SS_NOPREFIX LTEXT "Copyright (C) 2011",IDC_STATIC,173,150,114,8 DEFPUSHBUTTON "OK",IDOK,286,158,50,14,WS_GROUP EDITTEXT IDC_EDIT1,33,18,102,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,33,33,102,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,35,49,100,11,ES_AUTOHSCROLL PUSHBUTTON "Вращение",IDC_ROTATION,36,68,71,17 PUSHBUTTON "Поворот",IDC_ROTED,38,90,68,17 PUSHBUTTON "Стоп",IDC_STOP,39,111,66,16 PUSHBUTTON "Button4",IDC_BUTTON4,7,129,56,18 PUSHBUTTON "Button5",IDC_BUTTON5,74,129,60,17 END
IDD_DIALOG1 DIALOGEX 233, 0, 461, 437 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE | WS_SYSMENU FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN END
///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO //
#ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN IDD_ABOUTBOX, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 226 TOPMARGIN, 7 BOTTOMMARGIN, 154 END
IDD_ABOUTBOX1, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 336 TOPMARGIN, 7 BOTTOMMARGIN, 172 END
IDD_DIALOG1, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 454 TOPMARGIN, 7 BOTTOMMARGIN, 176 END END #endif // APSTUDIO_INVOKED
#endif // Russian resources /////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32
///////////////////////////////////////////////////////////////////////////// // // Icon //
// 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"
///////////////////////////////////////////////////////////////////////////// // // Accelerator //
IDC_WINA ACCELERATORS BEGIN "?", IDM_ABOUT, ASCII, ALT "/", IDM_ABOUT, ASCII, ALT END
#ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE //
1 TEXTINCLUDE BEGIN "resource.h\0" END
2 TEXTINCLUDE BEGIN "#ifndef APSTUDIO_INVOKED\r\n" "#include ""targetver.h""\r\n" "#endif\r\n" "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END
3 TEXTINCLUDE BEGIN "\r\n" "\0" END
#endif // APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// // // String Table //
STRINGTABLE BEGIN IDS_APP_TITLE "wina" IDC_WINA "WINA" END
#endif // English (U.S.) resources /////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. //
///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED
|
| Категория: Полезные статьи общего назначения | Добавил: robesh (10.06.2011)
|
| Просмотров: 1835
| Рейтинг: 0.0/0 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
| |
 | |  |
|
|