基于对话框的MFC使用OpenGL在picture control画图

一条编程小咸鱼 2018-08-22 03:55:59
网上找了这个帖子讲的很详细https://blog.csdn.net/longxiaoshi/article/details/8238933,测试可用
但是问题在于我使用的对话框不是主对话框(假设为对话框1),我在对话框1新建了一个类,按照博客说的去做(由于没有OnInitDialog函数,所以我在绘图前调用了InitOpengl函数),InitOpengl函数没有问题,问题在于我无法对此picture control控件进行绘图,使用简单的glbegin和glend都对图祥没有影响,这是为什么呢?
...全文
244 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:

void CMyStatic::DrawFunc()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -10.0f);

RotateDegQuad += 1.0f;// 旋转一下 看看
glRotatef(RotateDegQuad , 1.0f , 1.0f , 0.0f) ;
//画坐标系
glBegin(GL_LINES);
//x red
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(3.0, 0.0, 0.0);
//y blue
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(0.0, 0.0, 10.0);
//z green
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(0.0, 10.0, 0.0);
glEnd();
}


void CMyStatic::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
DrawFunc(); //定时器中调用这个函数
CStatic::OnTimer(nIDEvent);
}

果然是由于视角的原因,谢谢您啦!
schlafenhamster 2018-08-24
  • 打赏
  • 举报
回复

void CMyStatic::DrawFunc()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -10.0f);

RotateDegQuad += 1.0f;// 旋转一下 看看
glRotatef(RotateDegQuad , 1.0f , 1.0f , 0.0f) ;
//画坐标系
glBegin(GL_LINES);
//x red
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(3.0, 0.0, 0.0);
//y blue
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(0.0, 0.0, 10.0);
//z green
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(0.0, 10.0, 0.0);
glEnd();
}


void CMyStatic::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
DrawFunc(); //定时器中调用这个函数
CStatic::OnTimer(nIDEvent);
}

  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
是不是 有一个轴 正 对着 你 (一个 点 如 上面代码 红的 x 轴)

如果是这样,我能不能设置观察角度是45度呢?就像平时画三维坐标系那样。
gluPerspective(45.0f, aspect_ratio, 0.1, 100.0);第一个参数不是设置观察角度的吗?
schlafenhamster 2018-08-24
  • 打赏
  • 举报
回复
是不是 有一个轴 正 对着 你 (一个 点 如 上面代码 红的 x 轴)
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:

//#define NO_SCALE
// Prozedur fuer Zeichnen eines Koordinatensystemes
//
void DrawKoordSystem (GLfloat xmin, GLfloat xmax, GLfloat ymin, GLfloat ymax,
GLfloat zmin, GLfloat zmax)
{
GLfloat i;
GLfloat akt_color[4];
GLint akt_mode;
// spitze // arrow
GLUquadricObj *spitze = gluNewQuadric();
if (!spitze) return;

glPushAttrib(GL_ALL_ATTRIB_BITS);
glGetFloatv(GL_CURRENT_COLOR, akt_color);
glDisable (GL_LIGHTING);

glBegin(GL_LINES);
// X
glColor3f ( 1.0, 0.0, 0.0 );// red
glVertex3f (xmin,0,0);
glVertex3f (xmax,0,0);
#ifndef NO_SCALE
for (i = xmin; i <= xmax; i++)
{
glVertex3f(i, -0.15, 0.0);
glVertex3f(i, 0.15, 0.0);
}
#endif
// Y
glColor3f ( 0.0, 1.0, 0.0 );// green
glVertex3f (0,ymin,0);
glVertex3f (0,ymax,0);
#ifndef NO_SCALE
for (i = ymin; i <= ymax; i++)
{
glVertex3f (-0.15, i, 0.0);
glVertex3f (0.15, i, 0.0);
}
#endif
// Z
glColor3f ( 0.0, 0.5, 1.0 );// blue
glVertex3f (0,0,zmin);
glVertex3f (0,0,zmax);
#ifndef NO_SCALE
for (i = zmin; i <= zmax; i++)
{
glVertex3f(-0.15, 0.0, i);
glVertex3f(0.15, 0.0, i);
}
#endif
glEnd();
// Ende Linienpaare // end axis and scale
glGetIntegerv(GL_MATRIX_MODE, &akt_mode);
glMatrixMode(GL_MODELVIEW);
#if 1
// zuerst die X-Achse // arrow first X-axis
glPushMatrix();
glTranslatef(xmax, 0., 0.);
glRotatef(90., 0., 1., 0.);// toword us
glColor3f( 1.0, 0.0, 0.0 );// red
gluCylinder(spitze, 0.12, 0., 1., 10, 10);
glPopMatrix();

// dann die Y-Achse // then Y-axis
glPushMatrix();
glTranslatef(0., ymax, 0.);
glRotatef(-90., 1., 0., 0.);// make up
glColor3f( 0.0, 1.0, 0.0 );// green
gluCylinder(spitze, 0.12, 0., 1., 10, 10);
glPopMatrix();

// zum Schluss die Z-Achse // at last Z-axis
glPushMatrix();
glTranslatef(0., 0., zmax);
glColor3f( 0.0, 0.5, 1.0 );// blue
gluCylinder(spitze, 0.12, 0., 1., 10, 10);
glPopMatrix();
#endif
//
glMatrixMode(akt_mode);
glColor4fv(akt_color);
glPopAttrib();

gluDeleteQuadric(spitze);
}


调用
DrawKoordSystem(-5, 5, -5, 5, -5, 5);

调用了此函数还是有问题,我把我的代码贴出来您看一下哪里有问题。
首先,我用对话框添加了一个类,设置了一个按钮响应函数:
[code=C]
void CProc{
ess::OnBnClickedProcessRead()
{
InitOpengl();
RenderScene1(); //向缓冲区绘图
SwapBuffers(m_pDC1->GetSafeHdc()); //交换缓冲区
}
BOOL CProcess::InitOpengl()
{
//获取图片控件DC
m_pDC1 = new CClientDC(GetDlgItem(IDC_PIC1));
if (m_pDC1 == NULL)
return FALSE;
//设置图片控件像素
if (!SetupPixelFormat())
return FALSE;
//创建兼容RC
m_hRC1 = wglCreateContext(m_pDC1->GetSafeHdc());
if (m_hRC1 == 0)
{
return FALSE;
}
//激活RC
if (wglMakeCurrent(m_pDC1->GetSafeHdc(), m_hRC1) == FALSE)
{
return FALSE;
}

//设置投影模式
GLdouble aspect_ratio;
GLsizei width, height;
CRect rect;
CWnd *pWnd = NULL;
pWnd = GetDlgItem(IDC_PIC1);
pWnd->GetClientRect(rect);
//y = rect.CenterPoint;
width = rect.right - rect.left;
height = rect.bottom - rect.top;

glViewport(0, 0, rect.Width(), rect.Height());
aspect_ratio = (GLdouble)width / (GLdouble)height;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, aspect_ratio, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations

return TRUE;
}
BOOL CProcess::SetupPixelFormat()
{
static PIXELFORMATDESCRIPTOR pfd =
{
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,0,
16,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};
int m_nPixelFormat = ChoosePixelFormat(m_pDC1->GetSafeHdc(), &pfd);//在窗口找查找该像素格式
if (m_nPixelFormat == 0)
{
return FALSE;
}
if (SetPixelFormat(m_pDC1->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE)//设置picture控件的像素格式
{
return FALSE;
}
return TRUE;
}
void CProcess::RenderScene1()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0.0f, 0.0f, -5.0f);
//画坐标系

//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glLoadIdentity();
glBegin(GL_LINES);
//x
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(3.0, 0.0, 0.0);
//y
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(0.0, 0.0, 10.0);
//z
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(0.0, 3.0, 0.0);
glEnd();
}
[/code]

然后点击按钮,坐标系就只有两条线(红线和绿线),这是为什么呢
schlafenhamster 2018-08-23
  • 打赏
  • 举报
回复

//#define NO_SCALE
// Prozedur fuer Zeichnen eines Koordinatensystemes
//
void DrawKoordSystem (GLfloat xmin, GLfloat xmax, GLfloat ymin, GLfloat ymax,
GLfloat zmin, GLfloat zmax)
{
GLfloat i;
GLfloat akt_color[4];
GLint akt_mode;
// spitze // arrow
GLUquadricObj *spitze = gluNewQuadric();
if (!spitze) return;

glPushAttrib(GL_ALL_ATTRIB_BITS);
glGetFloatv(GL_CURRENT_COLOR, akt_color);
glDisable (GL_LIGHTING);

glBegin(GL_LINES);
// X
glColor3f ( 1.0, 0.0, 0.0 );// red
glVertex3f (xmin,0,0);
glVertex3f (xmax,0,0);
#ifndef NO_SCALE
for (i = xmin; i <= xmax; i++)
{
glVertex3f(i, -0.15, 0.0);
glVertex3f(i, 0.15, 0.0);
}
#endif
// Y
glColor3f ( 0.0, 1.0, 0.0 );// green
glVertex3f (0,ymin,0);
glVertex3f (0,ymax,0);
#ifndef NO_SCALE
for (i = ymin; i <= ymax; i++)
{
glVertex3f (-0.15, i, 0.0);
glVertex3f (0.15, i, 0.0);
}
#endif
// Z
glColor3f ( 0.0, 0.5, 1.0 );// blue
glVertex3f (0,0,zmin);
glVertex3f (0,0,zmax);
#ifndef NO_SCALE
for (i = zmin; i <= zmax; i++)
{
glVertex3f(-0.15, 0.0, i);
glVertex3f(0.15, 0.0, i);
}
#endif
glEnd();
// Ende Linienpaare // end axis and scale
glGetIntegerv(GL_MATRIX_MODE, &akt_mode);
glMatrixMode(GL_MODELVIEW);
#if 1
// zuerst die X-Achse // arrow first X-axis
glPushMatrix();
glTranslatef(xmax, 0., 0.);
glRotatef(90., 0., 1., 0.);// toword us
glColor3f( 1.0, 0.0, 0.0 );// red
gluCylinder(spitze, 0.12, 0., 1., 10, 10);
glPopMatrix();

// dann die Y-Achse // then Y-axis
glPushMatrix();
glTranslatef(0., ymax, 0.);
glRotatef(-90., 1., 0., 0.);// make up
glColor3f( 0.0, 1.0, 0.0 );// green
gluCylinder(spitze, 0.12, 0., 1., 10, 10);
glPopMatrix();

// zum Schluss die Z-Achse // at last Z-axis
glPushMatrix();
glTranslatef(0., 0., zmax);
glColor3f( 0.0, 0.5, 1.0 );// blue
gluCylinder(spitze, 0.12, 0., 1., 10, 10);
glPopMatrix();
#endif
//
glMatrixMode(akt_mode);
glColor4fv(akt_color);
glPopAttrib();

gluDeleteQuadric(spitze);
}


调用
DrawKoordSystem(-5, 5, -5, 5, -5, 5);
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
"无法对此picture control控件进行绘图"
上代码

现在已经可以显示了(不知道为什么又可以了),但是我写了一个很简单的画坐标轴的函数,用了glVertex3f()函数绘制坐标轴,不知道为什么改变第三个参数图像没有效果。绘图代码如下:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
glBegin(GL_LINES);
//x
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(3.0, 0.0, 0.0);
//y
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(0.0, 0.0, 1.0);
//z
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, (0)*-1.0);
glVertex3f(0.0, 3.0, 0.0);
glEnd();
这个函数的y轴没法显示是怎么回事呢,按理说glVertex3f函数的第三个参数应该是指定深度的吧。
schlafenhamster 2018-08-22
  • 打赏
  • 举报
回复
"无法对此picture control控件进行绘图"
上代码

19,468

社区成员

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

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