如何在VC6或者VC7下用 ATL做一个OpenGL的(COM)控件?
来源:互联网 发布:windows 修改系统语言 编辑:程序博客网 时间:2024/05/16 18:10
如何在COM" target=_blank>COM" target=_blank>VC6COM" target=_blank>或者COM" target=_blank>COM" target=_blank>VC7下用 COM" target=_blank>ATLCOM" target=_blank>做一个COM" target=_blank>OpenGL的(COM)控件?COM:office:office" />
目的:由于在写COM" target=_blank>OpenGL程序的时候这些东西每次都要写一遍,而且特别繁琐!为了刚步入COM" target=_blank>OpenGL人提供一个界面控件,让他们较早的看到自己写的COM" target=_blank>OpenGL程序的效果!让他们觉得COM" target=_blank>OpenGL的神奇!
作者:王卫星(wangweixing2000)
1, 新建一个COM" target=_blank>ATL空项目(项目名COM" target=_blank>OpenGL_COM" target=_blank>ATL)
2, 添加一个COM" target=_blank>ATL对象(MyControl)(COM" target=_blank>COM" target=_blank>VC6下为Full Control,COM" target=_blank>COM" target=_blank>VC7下为COM" target=_blank>ATL控件)必须选中Support Connection Points为了添加事件。
3, 在对象的.H头文件中添加:
#include <gl/gl.h>
#include <gl/glu.h>
#pragma COMment(lib, "COM" target=_blank>OpenGL32.lib")
#pragma COMment(lib, "glu32.lib")
4, 在接口实现类添加一个COM" target=_blank>OpenGL 的RC(rendering context)成员变量:
HGLRC m_hRC;
5, 添加一个设置COM" target=_blank>OpenGL像素格式(接口实现类的)成员函数:
// Set COM" target=_blank>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_COM" target=_blank>OpenGL | // support COM" target=_blank>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)
{
COM" target=_blank>ATLASSERT(FALSE);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, &pfd) == FALSE)
{
COM" target=_blank>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 COMment1>/*uMsg*/, WPARAM COMment1>/*wParam*/, LPARAM COMment1>/*lParam*/, BOOL& COMment1>/*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(COM" target=_blank>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)
//在COM" target=_blank>COM" target=_blank>VC7下不用加前缀Fire
//OnRender(rc.right , rc.left, rc.bottom , rc.top)
glFinish();
SwapBuffers(wglGetCurrentDC());
return S_OK;
}
9, 编译。
要?<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>