我用MFC写了一个opengl的程序画三角形,但是结果显示不出来!

时间:2022-10-03 16:43:43
本人用MFC写了一个opengl的程序,但是结果只有背景颜色,三角形不显示!好几天,一直没找到原因,望大家帮忙!下面是代码:
// Opengl.cpp: implementation of the COpengl class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MFCopengl.h"
#include "Opengl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

COpengl::COpengl()
{

}

COpengl::~COpengl()
{
if(wglGetCurrentContext()!=NULL)
wglMakeCurrent(NULL,NULL);
if(m_hGLContext!=NULL)
{
wglDeleteContext(m_hGLContext);
m_hGLContext=NULL;
}
}
bool COpengl::CreateGLcontext()
{
m_hGLContext=wglCreateContext(m_hdc);
if(m_hGLContext==NULL)
{
AfxMessageBox("产生渲染上下文失败!");
return FALSE;
}
if(wglMakeCurrent(m_hdc,m_hGLContext)==FALSE)
{
AfxMessageBox("设置渲染上下文失败!");
return FALSE;
}
return true;
}
int COpengl::OnGLInitial(HDC m_hdc1)
{
m_hdc=m_hdc1;
if(SetWindowPixel()==false)
return -1;
if(CreateGLcontext()==false)
return -1;
return 0;
}
bool COpengl::SetWindowPixel()
{
PIXELFORMATDESCRIPTOR pixelDesc;
pixelDesc.nSize=sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion=1;
pixelDesc.dwFlags=PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
pixelDesc.iPixelType=PFD_TYPE_RGBA;
pixelDesc.cColorBits=24;
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.cAccumBlueBits=0;
pixelDesc.cAccumGreenBits=0;
pixelDesc.cAccumAlphaBits=0;
pixelDesc.cDepthBits=32;
pixelDesc.cStencilBits=0;
pixelDesc.cAuxBuffers=0;
pixelDesc.bReserved=0;
pixelDesc.dwDamageMask=0;
int m_GLPixelIndex=ChoosePixelFormat(m_hdc,&pixelDesc);
if(m_GLPixelIndex==0)
{
m_GLPixelIndex=1;
if(DescribePixelFormat(m_hdc,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
return FALSE;
}
if(!SetPixelFormat(m_hdc,m_GLPixelIndex,&pixelDesc))
return FALSE;
return TRUE;
}
void COpengl::SwapGLBuffer()
{
SwapBuffers(m_hdc);
}
void COpengl::ClearBuffer()
{
glClearColor(0.5,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
}
void COpengl::DrawWithOpenGL()
{
glColor3f(1.0,1.0,1.0);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
glVertex3f(-1.0f,1.0f,0.0f);
glEnd();

}
void COpengl::OnReshape(int cx,int cy)
{
GLsizei width,height;
    GLdouble aspect;
    width = cx;
    height = cy;
if(cy==0)
    {
        aspect = (GLdouble)width;
    }
    else
    {
        aspect = (GLdouble)width/(GLdouble)height;
    }
glViewport(0,0,width,height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0,500.0*aspect,0.0,500.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

BOOL CMFCopenglView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
//  the CREATESTRUCT cs
cs.style|=(WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
cs.lpszClass=AfxRegisterWndClass(CS_OWNDC);
return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMFCopenglView drawing

void CMFCopenglView::OnDraw(CDC* pDC)
{
CMFCopenglDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
m_bgl.ClearBuffer();
m_bgl.DrawWithOpenGL();
m_bgl.SwapGLBuffer();
}

/////////////////////////////////////////////////////////////////////////////
// CMFCopenglView diagnostics

#ifdef _DEBUG
void CMFCopenglView::AssertValid() const
{
CView::AssertValid();
}

void CMFCopenglView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CMFCopenglDoc* CMFCopenglView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCopenglDoc)));
return (CMFCopenglDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMFCopenglView message handlers

int CMFCopenglView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDC dc(this);
return (m_bgl.OnGLInitial(dc.m_hDC));
}

void CMFCopenglView::OnSize(UINT nType, int cx, int cy) 
{
CView::OnSize(nType, cx, cy);
m_bgl.OnReshape(cx,cy);
}

5 个解决方案

#1


可能的原因:
1、三角形的点距离太小,视场大,看不见。
2、三角形的定点坐标在视口之外。
3、画线颜色是背景色或者透明度为100%。
估计您是2.
您改变下三角形的定点坐标看看,可以看看demo。

#2


引用 1 楼  的回复:
可能的原因:
1、三角形的点距离太小,视场大,看不见。
2、三角形的定点坐标在视口之外。
3、画线颜色是背景色或者透明度为100%。
估计您是2.
您改变下三角形的定点坐标看看,可以看看demo。

问一下,能具体点,刚学opengl,不太明白!

#3


刚学opengl 就用mfc框架啊。。。
glut框架比较适合初学者啊。

#4


你可以先在MFC中把OpenGL的框架搭建好,然后再做其他的,就一目了然了,要的话我给你,留下你的联系方式

#5


在绘图前 向屏幕里面就是z的方向移动一个距离,就看见了。

#1


可能的原因:
1、三角形的点距离太小,视场大,看不见。
2、三角形的定点坐标在视口之外。
3、画线颜色是背景色或者透明度为100%。
估计您是2.
您改变下三角形的定点坐标看看,可以看看demo。

#2


引用 1 楼  的回复:
可能的原因:
1、三角形的点距离太小,视场大,看不见。
2、三角形的定点坐标在视口之外。
3、画线颜色是背景色或者透明度为100%。
估计您是2.
您改变下三角形的定点坐标看看,可以看看demo。

问一下,能具体点,刚学opengl,不太明白!

#3


刚学opengl 就用mfc框架啊。。。
glut框架比较适合初学者啊。

#4


你可以先在MFC中把OpenGL的框架搭建好,然后再做其他的,就一目了然了,要的话我给你,留下你的联系方式

#5


在绘图前 向屏幕里面就是z的方向移动一个距离,就看见了。