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

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

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


{
 return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_GLTEST);

// 主消息循环:
while ( true )
{
 if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
 {
  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
  }
  continue;
 }
 if ( WM_QUIT == msg.message )
 {
  break;
 }
 OnIdle();
}

return (int) msg.wParam;
}



//
// 函数:MyRegisterClass()
//
// 目的:注册窗口类。
//
// 注释:
//
//  仅当希望在已添加到 Windows 95 的
//  “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
//  才需要此函数及其用法。调用此函数
//  十分重要,这样应用程序就可以获得关联的
//  “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style  = 0;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon  = LoadIcon(hInstance, (LPCTSTR)IDI_GLTEST);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW 1);
wcex.lpszMenuName = (LPCTSTR)IDC_GLTEST;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);
}

//
//  函数:InitInstance(HANDLE, int)
//
//  目的:保存实例句柄并创建主窗口
//
//  注释:
//
//    在此函数中,我们在全局变量中保存实例句柄并
//    创建和显示主程序窗口。
//
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;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message)
{
case WM_CREATE:
 OnCreate( hWnd );
 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 );
glColor3ub( 140, 200, 255 );
}

void OnDraw( void )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glBegin( GL_QUADS ); // 设置绘制模式,我们画一个平面的四边形
glVertex2i( 5, 5 );
glVertex2i( -5, 5 );
glVertex2i( -5, -5 );
glVertex2i( 5, -5 );
glEnd();
SwapBuffers( g_hDC ); // 交换前后缓冲,双缓冲无闪烁
}

void SetModalMatrix( void )
{
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );

标签:

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

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

下一篇:VisualC 编程封装ADO类