为什么我这个程序没有出现想要的结果??求高手解答

zywhuiss 2007-04-28 09:24:00
我用MFC 建了一个单文档,想用OpenGL来画图,但是第一步就收挫,没有出现我想要的结果,View类的代码如下,请高手指出其中的错误,小弟不胜感激!
#include "stdafx.h"
#include "MySDOpenGL.h"

#include "MySDOpenGLDoc.h"
#include "MySDOpenGLView.h"

#include <GL/glut.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMySDOpenGLView

IMPLEMENT_DYNCREATE(CMySDOpenGLView, CView)

BEGIN_MESSAGE_MAP(CMySDOpenGLView, CView)
//{{AFX_MSG_MAP(CMySDOpenGLView)
ON_WM_CREATE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMySDOpenGLView construction/destruction

CMySDOpenGLView::CMySDOpenGLView()
{
// TODO: add construction code here

}

CMySDOpenGLView::~CMySDOpenGLView()
{
DestroyOpenGL();
}

BOOL CMySDOpenGLView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMySDOpenGLView drawing

void CMySDOpenGLView::OnDraw(CDC* pDC)
{
CMySDOpenGLDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMySDOpenGLView printing

BOOL CMySDOpenGLView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}

void CMySDOpenGLView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}

void CMySDOpenGLView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMySDOpenGLView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMySDOpenGLView message handlers

int CMySDOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
InitOpenGL();
// TODO: Add your specialized creation code here

return 0;
}

void CMySDOpenGLView::InitOpenGL(void)
{
int nPixelFormat; // Pixel format index
m_hDC= ::GetDC(m_hWnd);// Get the Device context
/*CClientDC dc(this);
dc.TextOut(50,50,"octopus");*/
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 = 8;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 0;
pixelDesc.cAccumRedBits = 0;
pixelDesc.cAccumGreenBits = 0;
pixelDesc.cAccumBlueBits = 0;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 32;
pixelDesc.cStencilBits = 0;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;
// Choose a pixel format that best matches that described in pfd
if((nPixelFormat = ::ChoosePixelFormat(m_hDC, &pixelDesc))==0)
{
::MessageBox(this->m_hWnd,"Choose Pixel Format Failed!\t","ERROR",MB_OK);
return;
}

// Set the pixel format for the device context
if(!::SetPixelFormat(m_hDC, nPixelFormat, &pixelDesc))
{
::MessageBox(this->m_hWnd,"Set Pixel Format Failed!\t","ERROR",MB_OK);
return;
}

nPixelFormat=::GetPixelFormat(m_hDC);
::DescribePixelFormat(m_hDC,nPixelFormat,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc);

m_hRC = wglCreateContext(m_hDC);
::wglMakeCurrent(m_hDC,m_hRC);
glClearColor(1.0f,0.0f,0.2f,0.0f);
glFlush();
}

void CMySDOpenGLView::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
//InitOpenGL();
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,1.0,1.0);
glBegin(GL_TRIANGLES);
glVertex2i(0,0);
glVertex2i(1,0);
glVertex2i(1,1);
glEnd();
glFlush();

// Do not call CView::OnPaint() for painting messages
}

void CMySDOpenGLView::DestroyOpenGL()
{
::wglMakeCurrent(NULL,NULL);
if(m_hRC)
::wglDeleteContext(m_hRC);
if(m_hDC)
::ReleaseDC(this->m_hWnd,m_hDC);
return;
}

我希望的是运行后窗口客户区变成指定的颜色,但是窗口没有反应。
谢谢。
我只有20多分,不好意思了。
...全文
244 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zywhuiss 2007-04-30
  • 打赏
  • 举报
回复
谢谢上面的大哥!问题已经解决,确实是没有::SwapBuffers(m_hDC);
xkit 2007-04-28
  • 打赏
  • 举报
回复
设置成双缓冲区,显示时应该交换缓冲区,可以用::SwapBuffers(wglGetCurrentDC()),而且也没有设置视口和投影矩阵
微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 微信小程序系统教程共有“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]——核心技术”、“微信小程序系统教程[阶段]客服消息+微信支付+九宝电商系统”。 “微信小程序系统教程[阶段]全套课程”包含: 1.微信小程序系统教程[阶段]_客服消息 2.微信小程序系统教程[阶段]_微信支付 3.微信小程序系统教程[阶段]_九宝电商系统 学习“微信小程序系统教程[阶段]”要有微信小程序的基础。建议先学习“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]”,后在报名“微信小程序系统教程[阶段]”。 阶段讲解的客服消息,是针对小程序的。后台程序用接近底层的技术,没有使用三方技术。这样降低同学们学习成本。 微信支付,这部分课程很有难度,要同学们认真听讲,有不会的技术问题可以请教老师。购买课程后请联系老师,提供单号,给你源程序。 九宝电商系统是一套十分适和学习、项目的课程。既可以系统的学习微信小程序相关知识,还可以修改后上线。 “微信小程序系统教程[中级阶段]——核心技术”重点讲解微信小程序事件、组件、API 微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 购买课程的同学,可赠送就九宝老师编写的《微信小程序开发宝典》。 购课请咨询qq2326321088

19,468

社区成员

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

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