如何在vc++6.0里面使用openGl?

如何在vc++6.0里面使用openGl?,第1张

你既可以建立Win32项目使用API,也可以建立MFC工程

(一般不用MFC框架直接用API)

我给你一个例子吧,建立Win32空项目,添加一个cpp文件,编译执行就行了

(这是一个经典的opengl框架了)代码如下:

#pragma comment(lib,"opengl32.lib")

#pragma comment(lib,"glu32.lib")

#pragma comment(lib,"glaux.lib")

#include <windows.h>

#include <gl/gl.h>

#include <gl/glu.h>

#include <gl/glaux.h>

HDC hDC=NULL

HGLRC hRC=NULL

HWND hWnd=NULL

HINSTANCE hInstance

BOOL keys[256]

BOOL active=TRUE

BOOL fullscreen=TRUE

GLfloat rtri

GLfloat rquad

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)

GLvoid ResizeGLScene(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)

glLoadIdentity()

}

int InitGL(GLvoid)

{

glShadeModel(GL_SMOOTH)

glClearColor(0.0f,0.0f,0.0f,0.5f)

glClearDepth(1.0f)

glEnable(GL_DEPTH_TEST)

glDepthFunc(GL_LEQUAL)

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST)

return TRUE

}

int DrawGLScene(GLvoid)

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

glLoadIdentity()

glTranslatef(-1.5f,0.0f,-6.0f)

glRotatef(rtri,0.0f,1.0f,0.0f)

glBegin(GL_TRIANGLES)

glColor3f(1.0f,0.0f,0.0f)

glVertex3f(0.0f,1.0f,0.0f)

glColor3f(0.0f,1.0f,0.0f)

glVertex3f(-1.0f,-1.0f,1.0f)

glColor3f(0.0f,0.0f,1.0f)

glVertex3f(1.0f,-1.0f,1.0f)

glColor3f(1.0f,0.0f,0.0f)

glVertex3f(0.0f,1.0f,0.0f)

glColor3f(0.0f,0.0f,1.0f)

glVertex3f(1.0f,-1.0f,1.0f)

glColor3f(0.0f,1.0f,0.0f)

glVertex3f(1.0f,-1.0f,-1.0f)

glColor3f(1.0f,0.0f,0.0f)

glVertex3f(0.0f,1.0f,0.0f)

glColor3f(0.0f,1.0f,0.0f)

glVertex3f(1.0f,-1.0f,-1.0f)

glColor3f(0.0f,0.0f,1.0f)

glVertex3f(-1.0f,-1.0f,-1.0f)

glColor3f(1.0f,0.0f,0.0f)

glVertex3f(0.0f,1.0f,0.0f)

glColor3f(0.0f,0.0f,1.0f)

glVertex3f(-1.0f,-1.0f,-1.0f)

glColor3f(0.0f,1.0f,0.0f)

glVertex3f(-1.0f,-1.0f,1.0f)

glEnd()

glLoadIdentity()

glTranslatef(1.5f,0.0f,-7.0f)

glRotatef(rquad,1.0f,1.0f,1.0f)

glBegin(GL_QUADS)

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)

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)

glColor3f(1.0f,0.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)

glColor3f(1.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)

glVertex3f(1.0f,-1.0f,-1.0f)

glVertex3f(-1.0f,-1.0f,-1.0f)

glColor3f(0.0f,0.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)

glColor3f(1.0f,0.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()

rtri+=0.2f

rquad-=0.15f

return TRUE

}

GLvoid KillGLWindow(GLvoid)

{

if(fullscreen)

{

ChangeDisplaySettings(NULL,0)

ShowCursor(TRUE)

}

if(hRC)

{

if(!wglMakeCurrent(NULL,NULL))

MessageBox(NULL,"释放DC或RC失败","关闭错误",MB_OK|MB_ICONINFORMATION)

if(!wglDeleteContext(hRC))

MessageBox(NULL,"释放RC失败","关闭错误",MB_OK|MB_ICONINFORMATION)

hRC=NULL

}

if(hDC &&!ReleaseDC(hWnd,hDC))

{

MessageBox(NULL,"释放DC失败","关闭错误",MB_OK|MB_ICONINFORMATION)

hDC=NULL

}

if(hWnd &&!DestroyWindow(hWnd))

{

MessageBox(NULL,"释放窗口句柄失败","关闭错误",MB_OK|MB_ICONINFORMATION)

hWnd=NULL

}

if(!UnregisterClass("OpenG",hInstance))

{

MessageBox(NULL,"不能注销窗口类","关闭错误",MB_OK|MB_ICONINFORMATION)

hInstance=NULL

}

}

BOOL CreateGLWindow(char* title,int width,int height,int bits,BOOL fullscreenflag)

{

GLuint PixelFormat

WNDCLASS wc

DWORD dwExStyle

DWORD dwStyle

RECT WindowRect

WindowRect.left=(long)0

WindowRect.right=(long)width

WindowRect.top=(long)0

WindowRect.bottom=(long)height

fullscreen=fullscreenflag

hInstance=GetModuleHandle(NULL)

wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC

wc.lpfnWndProc=(WNDPROC)WndProc

wc.cbClsExtra=0

wc.cbWndExtra=0

wc.hInstance=hInstance

wc.hIcon=LoadIcon(NULL,IDI_WINLOGO)

wc.hCursor=LoadCursor(NULL,IDC_ARROW)

wc.hbrBackground=NULL

wc.lpszMenuName=NULL

wc.lpszClassName="OpenG"

if(!RegisterClass(&wc))

{

MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONINFORMATION)

return FALSE

}

if(fullscreen)

{

DEVMODE dmScreenSettings

memset(&dmScreenSettings,0,sizeof(dmScreenSettings))

dmScreenSettings.dmSize=sizeof(dmScreenSettings)

dmScreenSettings.dmPelsWidth=width

dmScreenSettings.dmPelsHeight=height

dmScreenSettings.dmBitsPerPel=bits

dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT

if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)

{

if(MessageBox(NULL,"全屏模式设置失败!\n使用窗口模式?","OpenGL 3D游戏编程",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)

{

fullscreen=FALSE

}

else

{

MessageBox(NULL,"程序将被关闭","错误",MB_OK|MB_ICONINFORMATION)

return FALSE

}

}

}

if(fullscreen)

{

dwExStyle=WS_EX_APPWINDOW

dwStyle=WS_POPUP

ShowCursor(FALSE)

}

else

{

dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE

dwStyle=WS_OVERLAPPEDWINDOW

}

AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle)

if(!(hWnd=CreateWindowEx(dwExStyle,"OpenG",title,

dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,0,0,

WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,

NULL,NULL,hInstance,NULL)))

{

KillGLWindow()

MessageBox(NULL,"窗口创建失败","错误",MB_OK|MB_ICONINFORMATION)

return FALSE

}

static PIXELFORMATDESCRIPTOR pfd=

{

sizeof(PIXELFORMATDESCRIPTOR),1,

PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,

PFD_TYPE_RGBA,bits,

0,0,0,0,0,0,

0,

0,

0,

0,0,0,0,

16,

0,

0,

PFD_MAIN_PLANE,

0,

0,0,0

}

if(!(hDC=GetDC(hWnd)))

{

KillGLWindow()

MessageBox(NULL,"不能创建一个窗口设备描述表","错误",MB_OK|MB_ICONINFORMATION)

return FALSE

}

if(!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))

{

KillGLWindow()

MessageBox(NULL,"不能创建一个匹配的像素格式","错误",MB_OK|MB_ICONINFORMATION)

return FALSE

}

if(!SetPixelFormat(hDC,PixelFormat,&pfd))

{

KillGLWindow()

MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONINFORMATION)

return FALSE

}

if(!(hRC=wglCreateContext(hDC)))

{

KillGLWindow()

MessageBox(NULL,"不能创建OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMATION)

return FALSE

}

if(!wglMakeCurrent(hDC,hRC))

{

KillGLWindow()

MessageBox(NULL,"不能激活当前的OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMATION)

return FALSE

}

ShowWindow(hWnd,SW_SHOW)

SetForegroundWindow(hWnd)

SetFocus(hWnd)

ResizeGLScene(width,height)

if(!InitGL())

{

KillGLWindow()

MessageBox(NULL,"初始化失败","错误",MB_OK|MB_ICONINFORMATION)

return FALSE

}

return TRUE

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)

{

switch(uMsg)

{

case WM_ACTIVATE:

{

if(!HIWORD(wParam))

active=TRUE

else

active=FALSE

return 0

}

case WM_SYSCOMMAND:

{

switch(wParam)

{

case SC_SCREENSAVE:

case SC_MONITORPOWER:

return 0

}

break

}

case WM_CLOSE:

{

PostQuitMessage(0)

return 0

}

case WM_KEYDOWN:

{

keys[wParam]=TRUE

return 0

}

case WM_KEYUP:

{

keys[wParam]=FALSE

return 0

}

case WM_SIZE:

{

ResizeGLScene(LOWORD(lParam),HIWORD(lParam))

return 0

}

}

return DefWindowProc(hWnd,uMsg,wParam,lParam)

}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{

MSG msg

BOOL done=FALSE

if(MessageBox(NULL,"你想在全屏模式下运行吗?","设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO)

{

fullscreen=FALSE

}

if(!CreateGLWindow("Win32 SDK风格 OpenGL程序框架",640,480,16,fullscreen))

return 0

while(!done)

{

if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))

{

if(msg.message==WM_QUIT)

done=TRUE

else

{

TranslateMessage(&msg)

DispatchMessage(&msg)

}

}

else

{

if(active)

{

if(keys[VK_ESCAPE])

done=TRUE

else

{

DrawGLScene()

SwapBuffers(hDC)

}

}

if(keys[VK_F1])

{

keys[VK_F1]=FALSE

KillGLWindow()

fullscreen=!fullscreen

if(!CreateGLWindow("Win32 SDK风格 OpenGL程序框架",640,480,16,fullscreen))

return 0

}

}

}

KillGLWindow()

return msg.wParam

}

看样子是你建的工程有问题,不然怎么会用到2.pch这种怪东西;

你新建一个控制器程序的工程试试,注意用空的工程;

然后自己建个main.cpp,把你代码拷进去编译试试;

你自己加了个GL文件夹,就要把这个文件夹放到VC6的include目录里,步骤如下:

选择菜单tools-》options-》include files目录下添加GL文件夹目录。

同样的,查看library files目录,如果dll和lib没有包含在里面,也将其所在文件夹加进去。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11927626.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存