目的:由於在寫OpenGL程序的時候這些東西每次都要寫一遍,而且特別繁瑣!為了剛步入OpenGL人提供一個界面控件,讓他們較早的看到自己寫的OpenGL程序的效果!讓他們覺得OpenGL的神奇!
1, 新建一個ATL空項目(項目名OpenGL_ATL)
2, 添加一個ATL對象(MyControl)(VC6下為Full Control,VC7下為ATL控件)必須選中Support Connection Points為了添加事件。
3, 在對象的.H頭文件中添加:
#include <gl/gl.h>
#include <gl/glu.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
4, 在接口實現類添加一個OpenGL 的RC(rendering context)成員變量:
HGLRC m_hRC;
5, 添加一個設置OpenGL像素格式(接口實現類的)成員函數:
// Set OpenGL pixel format for given DC
BOOL MyControl::SetupPixelFormat(HDC hdc)
{
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int pixelformat;
if ((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0)
{
ATLASSERT(FALSE);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, &pfd) == FALSE)
{
ATLASSERT(FALSE);
return FALSE;
}
return TRUE;
}
6, 添加一個Windows消息WM_CREATE
LRESULT CMyControl::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/,
LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
HDC hdc = GetDC();
RECT rc;
GetClIEntRect(&rc);
CreateContext(hdc, rc); //初始化
return 0;
}
7,添加一個Windows消息WM_DESTROY
LRESULT CMyControl::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
wglMakeCurrent(NULL, NULL);
if (m_hRC)
{
wglDeleteContext(m_hRC);
m_hRC = NULL;
}
return 0;
}
7, 添加一個事件OnRender,點擊ClassVIEw中的IMyControlEvents添加方法OnRender參數int right,int left,int bottom,int top確定,然後編譯你的idl文件,點擊CMyControl實現連接點選中IMyControlEvents點擊確定。
8, 在OnDraw添加代碼:
HRESULT OnDraw(ATL_DRAWINFO& di)
{
HDC hdc = di.hdcDraw;
RECT& rc = *(RECT*)di.prcBounds;
wglMakeCurrent(hdc, m_hRC);
glClearColor(1.0f, 0.0f, 0.0f, 10.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//激發OnRender事件
FireOnRender(rc.right , rc.left, rc.bottom , rc.top)
//在vc7下不用加前綴Fire
//OnRender(rc.right , rc.left, rc.bottom , rc.top)
glFinish();
SwapBuffers(wglGetCurrentDC());
return S_OK;
}
9, 編譯。
要使用本控件很簡單注冊拖到你的窗體上,然後在OnRender事件中寫你要畫的物體就可以了!