OpenGL和Group Box问题

AFX007 2003-11-28 06:42:50
请问怎样在Group Box中进行OpenGL绘图
用MFC
...全文
39 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
AFX007 2003-11-30
  • 打赏
  • 举报
回复
非常感谢
zhucde 2003-11-29
  • 打赏
  • 举报
回复
以上代码可以按照我写的,直接加入对应的文件就可以了(实在编译不出来给我留言,我把我编译好的发给你)
zhucde 2003-11-29
  • 打赏
  • 举报
回复
给你一段代码:
新建一个对话框,类名为CRender,ID为IDD_DIALOG2
新建一个picturn control;
设定其ID为IDC_RENDER(默认值为IDC_STATIC)
在Render.cpp头部加上:
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
同时,为你的工程加入库winmm.lib opengl32.lib glu32.lib glaux.lib

在Render.h的public里加入:
BOOL SetWindowPixelFormat(HDC hDC);//设定象素格式
BOOL CreateViewGLContext(HDC hDC);
void RenderScene();
HDC hrenderDC;
HGLRC hrenderRC;
float m_yRotate;
int PixelFormat;

这样,在Render.cpp里就可以添加以上定义的成员函数了:
BOOL CRender::SetWindowPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pixelDesc;

pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;

pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER |
PFD_TYPE_RGBA;

pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 0;
pixelDesc.cRedShift = 0;
pixelDesc.cGreenBits = 0;
pixelDesc.cGreenShift = 0;
pixelDesc.cBlueBits = 0;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 0;
pixelDesc.cAccumRedBits = 0;
pixelDesc.cAccumGreenBits = 0;
pixelDesc.cAccumBlueBits = 0;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 0;
pixelDesc.cStencilBits = 0;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;

PixelFormat = ChoosePixelFormat(hDC,&pixelDesc);
if(PixelFormat==0) // Choose default
{
PixelFormat = 1;
if(DescribePixelFormat(hDC,PixelFormat,
sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
{
return FALSE;
}
}

if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE)

{
return FALSE;
}

return TRUE;
}


BOOL CRender::CreateViewGLContext(HDC hDC)
{
hrenderRC = wglCreateContext(hDC);

if(hrenderRC==NULL)
return FALSE;

if(wglMakeCurrent(hDC,hrenderRC)==FALSE)
return FALSE;



return TRUE;
}

void CRender::RenderScene()
{


/////////////////////////////////////////////////
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
// glRotated(m_xRotate, 1.0, 0.0, 0.0);
glRotated(m_yRotate, 0.0, 1.0, 0.0);
glBegin(GL_TRIANGLES); // Drawing Using Triangles

glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd(); // Finished Drawing The Triangle
SwapBuffers(hrenderDC);
}


下一步,就是初始化OpenGL了^_^,
为你的对话框添加WM_INITDIALOG消息:

BOOL CRender::OnInitDialog()
{
CDialog::OnInitDialog();

CWnd *wnd=GetDlgItem(IDC_RENDER);
hrenderDC=::GetDC(wnd->m_hWnd);
if(SetWindowPixelFormat(hrenderDC)==FALSE)
return 0;

if(CreateViewGLContext(hrenderDC)==FALSE)
return 0;
glPolygonMode(GL_FRONT,GL_FILL);
glPolygonMode(GL_BACK,GL_FILL);
///////////////////////////////////////////



glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glViewport(0,0,259,231);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45,1,0.1,100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
/////////////////////////////////////////////////////////////////////////
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

SetTimer(1,10,0);

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

接着添加WM_TIMER

void CRender::OnTimer(UINT nIDEvent)
{
RenderScene();
m_yRotate += 1;

CDialog::OnTimer(nIDEvent);
}

别忘了初始化
CRender::CRender(CWnd* pParent /*=NULL*/)
: CDialog(CRender::IDD, pParent)
{


PixelFormat=0;
m_yRotate = 0;
//{{AFX_DATA_INIT(CRender)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}

好了,运行一下看看,是不是看到一个旋转的白色三角形?

写得我累死了,有什么不明白给我消息!


AFX007 2003-11-28
  • 打赏
  • 举报
回复
picture control怎么画
神功智能 2003-11-28
  • 打赏
  • 举报
回复
推荐你在View里画!
zhucde 2003-11-28
  • 打赏
  • 举报
回复
这个倒没试过,
但为什么要在这里呢?
在picture control 里不行吗?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧