龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

如何在VC6或者VC7下用 ATL做一个OpenGL的(COM)控件?(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
6, 添加一个Windows消息WM_CREATE LRESULT CMyControl::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL /*bHandled*/) { HDC hdc = GetDC(); RECT rc; GetClientRect(rc); CreateCont

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事件中写你要画的物体就可以了!

精彩图集

赞助商链接