1.值得記住的約定
一般情況下,VC++下進行OpenGL應用程序開發步驟如下: 1.通過PIXELFORMATDESCRIPTOR結構設置備注描述表DC的像素格式屬性。 2.創建渲染描述表RC,并與設備描述表DC建立聯系。 3.使用OpenGL作圖 4.釋放所占用的資源,包括解除DC和RC的聯系、刪除RC及其關聯的DC。 在這里,應該先為應用程序添加所需的變量和函數,對相關變量進行初始化,然后在相應函數中實現DC像素格式設置、RC的創建及其和DC的關聯、圖形繪制以及資源釋放等功能。
2.一個典型實例
2.1 添加成員變量和成員函數
CClientDC* pDrawDC; // 用于指向當前DC的指針BOOL PixelformatSetting(void); // 用于設置像素格式
void GLSetting(void); // 用于創建渲染描述表RC 并關聯RC/DC
void DrawGraphics(void); //OpenGL作圖
2.2 添加消息響應函數
WM_CREATE ?--- OnCreate(); //該消息響應函數在建立一個窗體前被調用。 WM_DESTROY --- OnDestroy(); //窗口撤銷時響應此函數,因此在該函數中釋放所有被占用的資源。 WM_SIZE ? ?--- OnSize(); ? ?//改變窗口大小時響應此函數,可以調整視場。 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnSize(UINT nType, int cx, int cy);
2.3 成員函數和消息響應函數添加代碼
BOOL CtestGLView::PixelformatSetting(void)
{static PIXELFORMATDESCRIPTOR pdf ={sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,24,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,PFD_MAIN_PLANE,0,0,0,0}; //填充PIXELFORMATDISCRIPTORint ipixelformat;//獲得最佳匹配的像素格式索引if((ipixelformat = ChoosePixelFormat(pDrawDC->GetSafeHdc(), &pdf))==0){MessageBox(_T("Choose pixel format failed!"));return FALSE;}//把DC的像素格式設置成由索引值ipixelformat指向的像素格式if(SetPixelFormat(pDrawDC->GetSafeHdc(),ipixelformat, &pdf) == FALSE){MessageBox(_T("Set pixel format failed"));return FALSE;}return TRUE;
}
- 創建渲染描述表,調用PixelFormatSetting()設置像素格式,創建和DC關聯的RC
void CtestGLView::GLSetting(void)
{HGLRC hRC; //渲染描述表句柄pDrawDC = new CClientDC (this); //使用pDrawDC指向當前DCASSERT(pDrawDC != NULL);if( !PixelformatSetting()) //設置像素格式return;//創建和當前DC兼容的RC,并和當前DC關聯hRC = wglCreateContext(pDrawDC->GetSafeHdc());wglMakeCurrent(pDrawDC->GetSafeHdc(),hRC);
}
- 在消息響應函數OnCreate()中調用函數GLSetting(),使得GL環境生效
int CtestGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CView::OnCreate(lpCreateStruct) == -1)return -1;GLSetting();return 0;
}
void CtestGLView::DrawGraphics(void)
{//移動物體到顯示區glTranslatef(0.0,0.0,-6.0); //相當于在調整照相機 避免像太大glRotated(RotateAngle,1,1,1);//以邊線的方式繪制三角形glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//繪制三角形,順序給出3個三角形的頂點glBegin(GL_TRIANGLES);glVertex3f(-0.6,0,0);glVertex3f(0.6,0,0);glVertex3f(0.0,0.15,0.6);glVertex3f(-0.6,0,0);glVertex3f(0,0.15,0.6);glVertex3f(0,0.9,0.6);glVertex3f(0,0.9,0.6);glVertex3f(0,0.15,0.6);glVertex3f(0.6,0,0);glEnd();
}
void CtestGLView::OnDraw(CDC* /*pDC*/)
{CtestGLDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;static BOOL bBusy = FALSE; //定義開關變量if(bBusy) //開關 繪制完成后才可以更新緩存{return;}bBusy = TRUE;glClearColor(0,0,0.5,0.5);//設置背景顏色glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除深度緩存和顏色緩存glMatrixMode(GL_MODELVIEW); //啟動模型視圖矩陣glLoadIdentity();DrawGraphics();SwapBuffers(wglGetCurrentDC()); //更新緩存bBusy = FALSE;
}
void CtestGLView::OnDestroy()
{CView::OnDestroy();//刪除渲染描述表及其綁定的設備描述表HGLRC hRC; //OpenGL的渲染描述表 hRC = ::wglGetCurrentContext();::wglMakeCurrent(NULL,NULL); //解除當前RC和DC的關聯,并把當前RC非當前化if(hRC){::wglDeleteContext(hRC);}if(pDrawDC){delete pDrawDC;}
}
2.4 添加人機交互(旋轉功能)
采用鼠標左鍵控制開關,定時旋轉方案。 WM_BUTTONDOWN ?--- ?OnLButtonDown(); WM_TIMER ? ? ? --- ?OnTimer(); 添加變量: BOOL bRotate;
float RotateAngle;void CtestGLView::OnLButtonDown(UINT nFlags, CPoint point)
{if (bRotate){SetTimer(1,100,NULL);} else{KillTimer(1);}bRotate = !bRotate;CView::OnLButtonDown(nFlags, point);
}void CtestGLView::OnTimer(UINT_PTR nIDEvent)
{//定時器計時達到預定時刻 則旋轉角度增加10if( nIDEvent == 1){RotateAngle += 10;Invalidate(FALSE); //重新繪制}CView::OnTimer(nIDEvent);
}
3.輸出結果
總結
以上是生活随笔為你收集整理的VC++下的OpenGL编程的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。