// 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。
1、三角形的点距离太小,视场大,看不见。
2、三角形的定点坐标在视口之外。
3、画线颜色是背景色或者透明度为100%。
估计您是2.
您改变下三角形的定点坐标看看,可以看看demo。
#2
问一下,能具体点,刚学opengl,不太明白!
#3
刚学opengl 就用mfc框架啊。。。
glut框架比较适合初学者啊。
glut框架比较适合初学者啊。
#4
你可以先在MFC中把OpenGL的框架搭建好,然后再做其他的,就一目了然了,要的话我给你,留下你的联系方式
#5
在绘图前 向屏幕里面就是z的方向移动一个距离,就看见了。
#1
可能的原因:
1、三角形的点距离太小,视场大,看不见。
2、三角形的定点坐标在视口之外。
3、画线颜色是背景色或者透明度为100%。
估计您是2.
您改变下三角形的定点坐标看看,可以看看demo。
1、三角形的点距离太小,视场大,看不见。
2、三角形的定点坐标在视口之外。
3、画线颜色是背景色或者透明度为100%。
估计您是2.
您改变下三角形的定点坐标看看,可以看看demo。
#2
问一下,能具体点,刚学opengl,不太明白!
#3
刚学opengl 就用mfc框架啊。。。
glut框架比较适合初学者啊。
glut框架比较适合初学者啊。
#4
你可以先在MFC中把OpenGL的框架搭建好,然后再做其他的,就一目了然了,要的话我给你,留下你的联系方式
#5
在绘图前 向屏幕里面就是z的方向移动一个距离,就看见了。