|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
The Program Ported to Win32
The following program is a Win32 OpenGL program with the same OpenGL code used in the AUXDEMO.C sample program supplied with the Win32 SDK. Compare this program with the X Windows System OpenGL program in the above section.
/* * Example of a Win32 OpenGL program. * The OpenGL code is the same as that used in * the X Windows System sample. */ #include #include #include
/* Windows globals, defines, and prototypes */ CHAR szAppName[]="Win OpenGL"; HWND ghWnd; HDC ghDC; HGLRC ghRC;
#define SWAPBUFFERS SwapBuffers(ghDC) #define BLACK_INDEX 0 #define RED_INDEX 13 #define GREEN_INDEX 14 #define BLUE_INDEX 16 #define WIDTH 300
#define HEIGHT 200
LONG WINAPI MainWndProc (HWND, UINT, WPARAM, LPARAM); BOOL bSetupPixelFormat(HDC);
/* OpenGL globals, defines, and prototypes */ GLfloat latitude, longitude, latinc, longinc; GLdouble radius;
#define GLOBE 1 #define CYLINDER 2 #define CONE 3
GLvoid resize(GLsizei, GLsizei); GLvoid initializeGL(GLsizei, GLsizei); GLvoid drawScene(GLvoid); void polarView( GLdouble, GLdouble, GLdouble, GLdouble);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ MSG msg; WNDCLASS wndclass;
/* Register the frame class */ wndclass.style = 0; wndclass.lpfnWndProc = (WNDPROC)MainWndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (hInstance, szAppName); wndclass.hCursor = LoadCursor (NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wndclass.lpszMenuName = szAppName;
wndclass.lpszClassName = szAppName;
if (!RegisterClass (&wndclass) ) return FALSE;
/* Create the frame */ ghWnd = CreateWindow (szAppName, "Generic OpenGL Sample", WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, WIDTH, HEIGHT, NULL, NULL, hInstance, NULL);
/* make sure window was created */
if (!ghWnd) return FALSE;
/* show and update main window */ ShowWindow (ghWnd, nCmdShow);
UpdateWindow (ghWnd);
/* animation loop */ while (1) { /* * Process all pending messages */
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == TRUE) { if (GetMessage(&msg, NULL, 0, 0) ) { TranslateMessage(&msg); DispatchMessage(&msg);
} else { return TRUE; } } drawScene(); } }
/* main window procedure */ LONG WINAPI MainWndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LONG lRet = 1; PAINTSTRUCT ps; RECT rect;
switch (uMsg) {
case WM_CREATE: ghDC = GetDC(hWnd); if (!bSetupPixelFormat(ghDC)) PostQuitMessage (0);
ghRC = wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC); GetClientRect(hWnd, &rect); initializeGL(rect.right, rect.bottom); break;
case WM_PAINT: BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break;
case WM_SIZE: GetClientRect(hWnd, &rect); resize(rect.right, rect.bottom); break;
case WM_CLOSE: if (ghRC) wglDeleteContext(ghRC); if (ghDC) ReleaseDC(hWnd, ghDC);
ghRC = 0; ghDC = 0;
DestroyWindow (hWnd); break;
case WM_DESTROY: if (ghRC) wglDeleteContext(ghRC); if (ghDC) ReleaseDC(hWnd, ghDC);
PostQuitMessage (0); break; case WM_KEYDOWN: switch (wParam) { case VK_LEFT: longinc += 0.5F; break; case VK_RIGHT: longinc -= 0.5F; break; case VK_UP:
latinc += 0.5F; break; case VK_DOWN: latinc -= 0.5F; break; }
default: lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); break; }
return lRet; }
BOOL bSetupPixelFormat(HDC hdc) { PIXELFORMATDESCRIPTOR pfd, *ppfd; int pixelformat;
ppfd = &pfd;
ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR); ppfd->nVersion = 1; ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER; ppfd->dwLayerMask = PFD_MAIN_PLANE; ppfd->iPixelType = PFD_TYPE_COLORINDEX; ppfd->cColorBits = 8; ppfd->cDepthBits = 16; ppfd->cAccumBits = 0; ppfd->cStencilBits = 0;
pixelformat = ChoosePixelFormat(hdc, ppfd);
if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 ) { MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); return FALSE; }
if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
{ MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); return FALSE; }
return TRUE; }
/* OpenGL code */
GLvoid resize( GLsizei width, GLsizei height ) { GLfloat aspect;
glViewport( 0, 0, width, height );
aspect = (GLfloat) width / height;
glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45.0, aspect, 3.0, 7.0 ); glMatrixMode( GL_MODELVIEW ); }
GLvoid createObjects()
{ GLUquadricObj *quadObj;
glNewList(GLOBE, GL_COMPILE); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_LINE); gluSphere (quadObj, 1.5, 16, 16); glEndList();
glNewList(CONE, GL_COMPILE); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder(quadObj, 0.3, 0.0, 0.6, 15, 10); glEndList();
glNewList(CYLINDER, GL_COMPILE);
glPushMatrix (); glRotatef ((GLfloat)90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0); glTranslatef ((GLfloat)0.0, (GLfloat)0.0, (GLfloat)-1.0); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder (quadObj, 0.3, 0.3, 0.6, 12, 2); glPopMatrix (); glEndList(); }
GLvoid initializeGL(GLsizei width, GLsizei height) { GLfloat maxObjectSize, aspect;
GLdouble near_plane, far_plane;
glClearIndex( (GLfloat)BLACK_INDEX); glClearDepth( 1.0 );
glEnable(GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION ); aspect = (GLfloat) width / height; gluPerspective( 45.0, aspect, 3.0, 7.0 ); glMatrixMode( GL_MODELVIEW );
near_plane = 3.0; far_plane = 7.0; maxObjectSize = 3.0F; radius = near_plane + maxObjectSize/2.0;
latitude = 0.0F; longitude = 0.0F; latinc = 6.0F;
longinc = 2.5F;
createObjects(); }
void polarView(GLdouble radius, GLdouble twist, GLdouble latitude, GLdouble longitude) { glTranslated(0.0, 0.0, -radius); glRotated(-twist, 0.0, 0.0, 1.0); glRotated(-latitude, 1.0, 0.0, 0.0); glRotated(longitude, 0.0, 0.0, 1.0);
}
GLvoid drawScene(GLvoid) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
latitude += latinc; longitude += longinc;
polarView( radius, 0, latitude, longitude );
glIndexi(RED_INDEX); glCallList(CONE);
glIndexi(BLUE_INDEX); glCallList(GLOBE);
glIndexi(GREEN_INDEX); glPushMatrix(); glTranslatef(0.8F, -0.65F, 0.0F); glRotatef(30.0F, 1.0F, 0.5F, 1.0F); glCallList(CYLINDER); glPopMatrix();
glPopMatrix();
SWAPBUFFERS; }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Программа Перенесенная на Win32
Следующая программа является программой Win32 OpenGL с тем же кодом OpenGL использованным в программе образца AUXDEMO.C обеспеченным Win32 SDK. Сравните эту программу с программой X Windows System OpenGL в вышеуказанной секции.
/* * Пример программы Win32 OpenGL. * Код OpenGL такой же как и, что использовал в * образец Системы Окна X. */ #include #include #include
/* Окно глобальное, определяет, и прототипы */ CHAR szAppName[]="Win OpenGL"; HWND ghWnd; HDC ghDC; HGLRC ghRC;
#define SWAPBUFFERS SwapBuffers(ghDC) #define BLACK_INDEX 0 #define RED_INDEX 13 #define GREEN_INDEX 14 #define BLUE_INDEX 16 #define ШИРИНА 300
#define ВЫСОТА 200
ДОЛГО (ДЛИНОЙ) WINAPI MainWndProc (HWND, UINT, WPARAM, LPARAM); BOOL bSetupPixelFormat(HDC);
/* OpenGL ГЛОБАЛЬНЫЕ, определяет, и прототипы */ широта GLfloat, долгота, latinc, longinc; РАДИУС GLdouble;
ЗЕМНОЙ шар #define 1 #define ЦИЛИНДР 2 #define КОНУС 3
GLvoid МЕНЯЕТ размеры(GLsizei, GLsizei); GLvoid initializeGL(GLsizei, GLsizei); GLvoid drawScene(GLvoid); аннулируйте polarView( GLdouble, GLdouble, GLdouble, GLdouble);
int WINAPI WinMain (hInstance HINSTANCE, hPrevInstance HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{ msg MSG; wndclass WNDCLASS;
/* Зарегистрируйте фреймовый класс */ wndclass.style = 0; wndclass.lpfnWndProc = (WNDPROC)MainWndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (hInstance, szAppName); wndclass.hCursor = LoadCursor (НЕДЕЙСТВИТЕЛЬНЫЙ,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wndclass.lpszMenuName = szAppName;
wndclass.lpszClassName = szAppName;
если (!RegisterClass (&wndclass) ) ОБРАТНАЯ ЛОЖЬ;
/* Создайте фрейм */ ghWnd = CreateWindow (szAppName, "Образец Generic OpenGL", WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, ШИРИНА, ВЫСОТА, НЕДЕЙСТВИТЕЛЬНЫЕ, НЕДЕЙСТВИТЕЛЬНЫЕ, hInstance, НЕДЕЙСТВИТЕЛЬНЫЕ);
/* убедитесь что окно было создано */
если (!ghWnd) обратная ЛОЖЬ;
/* покажите и корректируйте основное окно */ ShowWindow (ghWnd, nCmdShow);
UpdateWindow (ghWnd);
/* цикл оживления */ пока (1) { /* * Обработайте все незаконченные сообщения */
пока (PeekMessage(&msg, НЕДЕЙСТВИТЕЛЬНЫЙ, 0, 0, PM_NOREMOVE) == ИСТИНА) { если (GetMessage(&msg, НЕДЕЙСТВИТЕЛЬНЫЙ, 0, 0) ) { TranslateMessage(&msg); DispatchMessage(&msg);
} еще { обратная ИСТИНА; } } drawScene(); } }
/* основная процедура окна */ ДОЛГО (ДЛИНОЙ) WINAPI MainWndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ДОЛГО (ДЛИНОЙ) lRet = 1; ps PAINTSTRUCT; RECT rect;
ключ (uMsg) {
случай WM_CREATE: ghDC = GetDC(hWnd); если (!bSetupPixelFormat(ghDC)) PostQuitMessage (0);
ghRC = wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC); GetClientRect(hWnd, &rect); initializeGL(rect.right, rect.bottom); прерывание;
случай WM_PAINT: BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); прерывание;
случай WM_SIZE: GetClientRect(hWnd, &rect); поменяйте размеры(rect.right, rect.низ); прерывание;
случай WM_CLOSE: если (ghRC) wglDeleteContext(ghRC); если (ghDC) ReleaseDC(hWnd, ghDC);
ghRC = 0; ghDC = 0;
DestroyWindow (hWnd); прерывание;
случай WM_DESTROY: если (ghRC) wglDeleteContext(ghRC); если (ghDC) ReleaseDC(hWnd, ghDC);
PostQuitMessage (0); прерывание; случай WM_KEYDOWN: ключ (wParam) { случай VK_LEFT: longinc += 0.5F; прерывание; случай VK_RIGHT: longinc -= 0.5F; прерывание; случай VK_UP:
latinc += 0.5F; прерывание; случай VK_DOWN: latinc -= 0.5F; прерывание; }
встроенный: lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); прерывание; }
возвращайте lRet; }
BOOL bSetupPixelFormat(HDC hdc) { PIXELFORMATDESCRIPTOR pfd, *ppfd; int pixelformat;
ppfd = &pfd;
ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR); ppfd->nVersion = 1; ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER; ppfd->dwLayerMask = PFD_MAIN_PLANE; ppfd->iPixelType = PFD_TYPE_COLORINDEX; ppfd->cColorBits = 8; ppfd->cDepthBits = 16; ppfd->cAccumBits = 0; ppfd->cStencilBits = 0;
pixelformat = ChoosePixelFormat(hdc, ppfd);
если ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 ) { MessageBox(НЕДЕЙСТВИТЕЛЬНЫЙ, "ChoosePixelFormat потерпевшее неудачу", "Ошибка", MB_OK); обратная ЛОЖЬ; }
если (SetPixelFormat(hdc, pixelformat, ppfd) == ЛОЖЬ)
{ MessageBox(НЕДЕЙСТВИТЕЛЬНЫЙ, "SetPixelFormat потерпевшее неудачу", "Ошибка", MB_OK); обратная ЛОЖЬ; }
возвращайтесь ВЕРНО; }
/* КОД OpenGL */
GLvoid МЕНЯЕТ размеры( ширина GLsizei, высота GLsizei ) { АСПЕКТ GLfloat;
glViewport( 0, 0, Ширина, высота );
аспект = ширины / высоты (GLfloat);
glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45.0, Аспект, 3.0, 7.0 ); glMatrixMode( GL_MODELVIEW ); }
GLvoid createObjects()
{ GLUquadricObj *quadObj;
glNewList(ЗЕМНОЙ шар, GL_COMPILE); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_LINE); gluSphere (quadObj, 1.5, 16, 16); glEndList();
glNewList(КОНУС, GL_COMPILE); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder(quadObj, 0.3, 0.0, 0.6, 15, 10); glEndList();
glNewList(ЦИЛИНДР, GL_COMPILE);
glPushMatrix (); glRotatef ((GLfloat)90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0); glTranslatef ((GLfloat)0.0, (GLfloat)0.0, (GLfloat)-1.0); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder (quadObj, 0.3, 0.3, 0.6, 12, 2); glPopMatrix (); glEndList(); }
GLvoid initializeGL(ШИРИНА GLsizei, высота GLsizei) { GLfloat maxObjectSize, АСПЕКТ;
GLdouble near_plane, far_plane;
glClearIndex( (GLfloat)BLACK_INDEX); glClearDepth( 1.0 );
glEnable(GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION ); аспект = ширины / высоты (GLfloat); gluPerspective( 45.0, Аспект, 3.0, 7.0 ); glMatrixMode( GL_MODELVIEW );
near_plane = 3.0; far_plane = 7.0; maxObjectSize = 3.0F; радиус = near_plane + maxObjectSize/2.0;
широта = 0.0F; долгота = 0.0F; latinc = 6.0F;
longinc = 2.5F;
createObjects(); }
пустота polarView(радиус GLdouble, искривление GLdouble, широта GLdouble, долгота GLdouble) { glTranslated(0.0, 0.0, -Радиус); glRotated(- Искривление, 0.0, 0.0, 1.0); glRotated(- Широта, 1.0, 0.0, 0.0); glRotated(Долгота, 0.0, 0.0, 1.0);
}
GLvoid drawScene(GLvoid) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
широта += latinc; долгота += longinc;
polarView( Радиус, 0, широта, долгота );
glIndexi(RED_INDEX); glCallList(КОНУС);
glIndexi(BLUE_INDEX); glCallList(ЗЕМНОЙ шар);
glIndexi(GREEN_INDEX); glPushMatrix(); glTranslatef(0.8F, -0.65F, 0.0F); glRotatef(30.0F, 1.0F, 0.5F, 1.0F); glCallList(ЦИЛИНДР); glPopMatrix();
glPopMatrix();
SWAPBUFFERS; }
| |
|
|
| |