VC .NETOpenGL编程快速入门(6)

2008-04-09 04:09:13来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


//    创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
  hInst = hInstance; // 将实例句柄存储在全局变量中

  CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
   CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  if ( !g_hWnd )
  {
   return FALSE;
  }
  OnCreated();

  ShowWindow( g_hWnd, nCmdShow );
  UpdateWindow( g_hWnd);

  return TRUE;
}

//
// 函数:WndProc(HWND, unsigned, WORD, LONG)
//
// 目的:处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message)
{
case WM_CREATE:
 OnCreate( hWnd );
 break;
case WM_KEYDOWN:
 g_bStartSwap = !g_bStartSwap;
 break;
case WM_MOVE:
 SetWindowText( g_hWnd, "Move" );
 break;
case WM_COMMAND:
 wmId  = LOWORD(wParam);
 wmEvent = HIWORD(wParam);
 // 分析菜单选择:
 switch (wmId)
 {
 case IDM_ABOUT:
  DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  break;
 case IDM_EXIT:
  DestroyWindow(hWnd);
  break;
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
 }
 break;
case WM_SIZE:
 SetProjMatrix( LOWORD( lParam ), HIWORD( lParam ) );
 break;
case WM_DESTROY:
 OnDestroy();
 PostQuitMessage(0);
 break;
default:
 return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// “关于”框的消息处理程序。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
 return TRUE;

case WM_COMMAND:
 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
 {
  EndDialog(hDlg, LOWORD(wParam));
  return TRUE;
 }
 break;
}
return FALSE;
}

void OnCreate( HWND hWnd )
{
g_hWnd = hWnd;
}

void OnDestroy( void )
{
ReleaseDC( g_hWnd, g_hDC );
wglDeleteContext( g_glRes );
}

void OnCreated( void )
{
g_hDC = GetDC( g_hWnd );

PIXELFORMATDESCRIPTOR pfd;
ZeroMemory( &pfd, sizeof(PIXELFORMATDESCRIPTOR) );
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 32;

SetPixelFormat( g_hDC, ChoosePixelFormat( g_hDC, &pfd ), &pfd );

g_glRes = wglCreateContext( g_hDC );
wglMakeCurrent( g_hDC, g_glRes );

glEnable( GL_CULL_FACE );
glCullFace( GL_BACK );

glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );

int LightPos[] = { 50, 50, 10, 1 };
float LightColor[] = { 0.3f, 0.3f, 0.3f, 1.0f };

glEnable(GL_LIGHTING);
glLightiv( GL_LIGHT0, GL_POSITION, LightPos );
glLightfv( GL_LIGHT0, GL_AMBIENT, LightColor );
glLightfv( GL_LIGHT0, GL_DIFFUSE, LightColor );
glEnable( GL_LIGHT0 );
glEnable( GL_COLOR_MATERIAL );
glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE );

glShadeModel( GL_SMOOTH );

glClearColor( 255.0f / 255.0f, 255.0f / 255.0f, 200.0f / 255.0f, 0.0 );
for ( int i = 0; i < 36; i )
{
 MoveMemory( &nTempBox[ i * 3 ], &nSrcBox[ byIndex[i] * 3 ], sizeof(nTempBox[0]) * 3 );
}
for ( int i = 0; i < 12; i )
{
 CalcNormal( &nTempBox[ i * 9 ], &fNormal[ i * 9 ] );
 MoveMemory( &fNormal[ i * 9 3 ], &fNormal[ i * 9 ], sizeof(fNormal[0]) * 3 );
 MoveMemory( &fNormal[ i * 9 6 ], &fNormal[ i * 9 ], sizeof(fNormal[0]) * 3 );
}
glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 3, GL_SHORT, 0, nTempBox );
glEnableClientState( GL_NORMAL_ARRAY );
glNormalPointer( GL_FLOAT, 0, fNormal );

glColor3ub( 140, 200, 255 );
}

void OnDraw( void )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glDrawArrays( GL_TRIANGLES, 0, 36 );
SwapBuffers( g_hDC );
}

void SetModalMatrix( void )
{
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );
static float fRadius = 0;
fRadius = 0.01f;
if ( fRadius > M_PI * 2 )
{
 fRadius = 0;
}
gluLookAt( cosf( fRadius ) * 30, sinf( fRadius ) * 30, 15.0,
 0.0, 0.0, 0.0,
 0.0, 0.0, 1.0 );
}

void SetProjMatrix( WORD wWidth, WORD wHeight )
{
glViewport( 0, 0, wWidth, wHeight );
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );
gluPerspective( 45.0, (double)wWidth / (double)wHeight, 1.0, 1000.0 );
}

void OnIdle( void )
{
SetModalMatrix();
OnDraw();
}
  现在已经达到我们想要的效果了。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:VC下用Win32API实现串行通信

下一篇:VisualC 编程封装ADO类