MFC+OpenGL+vc6实现bezier曲线 求助。QQ:41733842

z4b 2003-05-04 09:54:20
我在网上看到一篇关于用 vc5+mfc+opengl实现bezier曲线的例子可是怎么也在***view.cpp找不到 oncreat函数?先把原文章张贴如下,希望哪位大侠把调试好的源程序能以压缩包的形式发给我,谢谢了。z4b@163.com
一、产生程序框架 Test.dsw
New Project | MFC Application Wizard (EXE) | "Test" | OK
二、导入 Bezier 曲线类的文件。用下面方法产生 BezierCurve.h

BezierCurve.cpp 两个文件:
WorkSpace | ClassView | Test Classes| <右击弹出> New Class
| Generic Class(不用MFC类) | "CBezierCurve" | OK
三、编辑好 Bezier 曲线类的定义与实现。写好下面两个文件:
BezierCurve.h
BezierCurve.cpp
四、设置编译环境:
1. 在 BezierCurve.h 和 TestView.h 内各加上:

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

2. 在集成环境中,Project | Settings | Link | Object/library module

| "opengl32.lib glu32.lib glaux.lib" | OK

QQ: 41733842
Ewail: z4b@163.com
...全文
401 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerkzzz 2003-05-06
  • 打赏
  • 举报
回复
5、接4


void CTestView::OnDestroy()
{

wglMakeCurrent(m_pDC->m_hDC,NULL); //释放与m_hDC 对应的 RC

wglDeleteContext(m_hRC); //删除 RC



if (m_pDC)

delete m_pDC; //删除当前 View 拥有的 DC



CView::OnDestroy();

}

BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default

//return CView::OnEraseBkgnd(pDC);
return TRUE;
}

void CTestView::DrawScene()
{
glClearColor(0.0f,0.0f,0.0f,1.0f);//设置背景颜色为黑色

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glPushMatrix();



glTranslated(0.0f,0.0f,-3.0f);//把物体沿(0,0,-1)方向平移

//以便投影时可见。因为缺省的视点在(0,0,0),只有移开

//物体才能可见。

//本例是为了演示平面 Bezier 曲线的,只要作一个旋转

//变换,可更清楚的看到其 3D 效果。

//如?glRotated(30,1.0f,0.0f,0.0f); //绕 X 轴转 30 度

// glRotated(30,0.0f,1.0f,0.0f); //绕 Y 轴转 30 度



glBegin(GL_LINES);//画坐标系,由三条线段组成

glColor3f(1,0,0);

glVertex3f(0,0,0);

glVertex3f(1,0,0);//X坐标



glColor3f(0,1,0);

glVertex3f(0,0,0);

glVertex3f(0,1,0);//Y坐标



glColor3f(0,0,1);

glVertex3f(0,0,0);

glVertex3f(0,0,1);//Z坐标

glEnd();//end draw the 3D axis



//下面画一条 Bezier 曲线

bezier_curve.myPolygon();//画Bezier曲线的控制多边形



bezier_curve.myDraw(); //CBezierCurve bezier_curve

//是 CTestView 的成员变量

//具体的函数见附录



glPopMatrix();

glFinish(); //结束 RC 绘图

return;

}

void CTestView::OnSize(UINT nType, int cx, int cy)
{

CView::OnSize(nType, cx, cy);



VERIFY(wglMakeCurrent(m_pDC->m_hDC,m_hRC));//确认RC与当前DC关联

GLResize(cx, cy);//具体的响应 WM_SIZE 消息,对投影进行修正



VERIFY(wglMakeCurrent(NULL,NULL));//确认DC释放RC

}

void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{

CView::OnLButtonDown(nFlags, point);



if(bezier_curve.m_N>MAX-1)

{

MessageBox("顶点个数超过了最大数MAX=50");

return;

}



//以下为坐标变换作准备,

//说明:OpenGL 有一个更有力处理方式,即用 gluUnProject()

//这里为了证券交易起见,自己处理。

GetClientRect(&m_ClientRect);//获取视口区域大小

w=m_ClientRect.right-m_ClientRect.left;//视口宽度 w

h=m_ClientRect.bottom-m_ClientRect.top;//视口高度 h

//w,h 是CTestView的成员变量

centerx=(m_ClientRect.left+m_ClientRect.right)/2;//中心位置,

centery=(m_ClientRect.top+m_ClientRect.bottom)/2;//取之作原点

//centerx,centery 是 CTestView 的成员变量

GLdouble tmpx,tmpy;

tmpx=scrx2glx(point.x);//屏幕上点坐标转化为OpenGL画图的规范坐标

tmpy=scry2gly(point.y);



bezier_curve.m_Vertex[bezier_curve.m_N].x=tmpx;//加一个顶点

bezier_curve.m_Vertex[bezier_curve.m_N].y=tmpy;



bezier_curve.m_N++;//顶点数加一

InvalidateRect(NULL,TRUE);//发送刷新重绘消息
}

double CTestView::scrx2glx(int scrx)
{
return (double)(scrx-centerx)/double(h);
}

double CTestView::scry2gly(int scry)
{
return (double)(centery-scry)/double(h);
}
jerkzzz 2003-05-06
  • 打赏
  • 举报
回复
4、
// testView.cpp : implementation of the CTestView class
//

#include "stdafx.h"
#include "test.h"

#include "testDoc.h"
#include "testView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void GLResize(GLsizei w, GLsizei h) //GLResize() 是一个全局函数

{

// Prevent a divide by zero

if(h == 0)

h = 1;



glViewport(0, 0, w, h); //设置视口



glMatrixMode(GL_PROJECTION);//进入投影变换状态

glLoadIdentity();



//重新进行投影变换

gluPerspective (20.0f, (GLdouble)w/(GLdouble)h, 1.0, 40.0f);

glMatrixMode(GL_MODELVIEW);//结束投影变换

glLoadIdentity();

}

/////////////////////////////////////////////////////////////////////////////
// CTestView

IMPLEMENT_DYNCREATE(CTestView, CView)

BEGIN_MESSAGE_MAP(CTestView, CView)
//{{AFX_MSG_MAP(CTestView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
//}}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()

/////////////////////////////////////////////////////////////////////////////
// CTestView construction/destruction

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

}

CTestView::~CTestView()
{
}

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

/////////////////////////////////////////////////////////////////////////////
// CTestView drawing

void CTestView::OnDraw(CDC* pDC)
{
wglMakeCurrent(m_pDC->m_hDC,m_hRC);//使 RC 与当前 DC 相关联



DrawScene( ); //具体的绘图函数,在 RC 中绘制

SwapBuffers(m_pDC->m_hDC);//把 RC 中所绘传到当前的 DC 上,从而

//在屏幕上显示

wglMakeCurrent(m_pDC->m_hDC,NULL);//释放 RC,以便其它 DC 进行绘图 }
}
/////////////////////////////////////////////////////////////////////////////
// CTestView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTestView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTestView message handlers

int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

Init();

return 0;
}

void CTestView::Init()
{
m_pDC = new CClientDC(this); //创建 DC

ASSERT(m_pDC != NULL);

if (!bSetupPixelFormat()) //设定绘图的位图格式,函数下面列出

return;

m_hRC = wglCreateContext(m_pDC->m_hDC);//创建 RC

wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 与当前 DC 相关联

} //CClient * m_pDC; HGLRC m_hRC; 是 CTestView 的成员变量



BOOL CTestView::bSetupPixelFormat()

{

static PIXELFORMATDESCRIPTOR pfd =

{

sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd

1, // version number

PFD_DRAW_TO_WINDOW | // support window

PFD_SUPPORT_OPENGL | // support OpenGL

PFD_DOUBLEBUFFER, // double buffered

PFD_TYPE_RGBA, // RGBA type

24, // 24-bit color depth

0, 0, 0, 0, 0, 0, // color bits ignored

0, // no alpha buffer

0, // shift bit ignored

0, // no accumulation buffer

0, 0, 0, 0, // accum bits ignored

32, // 32-bit z-buffer

0, // no stencil buffer

0, // no auxiliary buffer

PFD_MAIN_PLANE, // main layer

0, // reserved

0, 0, 0 // layer masks ignored

};

int pixelformat;



if ( (pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 )

{

MessageBox("ChoosePixelFormat failed");

return FALSE;

}



if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE)

{

MessageBox("SetPixelFormat failed");

return FALSE;

}



return TRUE;

}

jerkzzz 2003-05-06
  • 打赏
  • 举报
回复
3、
// testView.h : interface of the CTestView class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_TESTVIEW_H__DD4F062D_0936_4E53_BD15_C1AC31EE948E__INCLUDED_)
#define AFX_TESTVIEW_H__DD4F062D_0936_4E53_BD15_C1AC31EE948E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>
#include "BezierCurve.h" // Added by ClassView


class CTestView : public CView
{
protected: // create from serialization only
CTestView();
DECLARE_DYNCREATE(CTestView)

// Attributes
public:
CTestDoc* GetDocument();

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTestView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL

// Implementation
public:
long centery;
long centerx;
long h;
long w;
CRect m_ClientRect;
CBezierCurve bezier_curve;
double scry2gly(int scry);
double scrx2glx(int scrx);
void DrawScene();
HGLRC m_hRC;
CDC *m_pDC;
BOOL bSetupPixelFormat();
void Init();
virtual ~CTestView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
//{{AFX_MSG(CTestView)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

#ifndef _DEBUG // debug version in testView.cpp
inline CTestDoc* CTestView::GetDocument()
{ return (CTestDoc*)m_pDocument; }
#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TESTVIEW_H__DD4F062D_0936_4E53_BD15_C1AC31EE948E__INCLUDED_)
huazaimh 2003-05-06
  • 打赏
  • 举报
回复
朋友,我不是不帮你,我实在是很想帮啊!
但是我没有做过OPenGL,所以啊,没有办法。
不过调试程序要有耐心喔,要仔细反复的想办法,主动的去搞定
这样才能取得长足的进步!
另:你发给我短消息我收到了,但是很遗憾帮不了你!
jerkzzz 2003-05-06
  • 打赏
  • 举报
回复
2、
// BezierCurve.cpp: implementation of the CBezierCurve class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "test.h"
#include "BezierCurve.h"
#define LEVEL 7

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CBezierCurve::CBezierCurve()

{

m_N=4;

m_Vertex[0].x=-0.5f;

m_Vertex[0].y=-0.5f;

m_Vertex[1].x=-0.5f;

m_Vertex[1].y=0.5f;

m_Vertex[2].x=0.5f;

m_Vertex[2].y=0.5f;

m_Vertex[3].x=0.5f;

m_Vertex[3].y=-0.5f;

}



CBezierCurve::~CBezierCurve()

{



}

void CBezierCurve::myDraw()

{

bezier_generation(m_Vertex,LEVEL);

}



void CBezierCurve::bezier_generation(myPOINT2D P[MAX], int level)

{ //算法的具体描述,请参考相关书本

int i,j;



level--;



if(level<0)return;



if(level==0) //不要写成level=0!!!

{

glColor3f(1.0f,1.0f,1.0f);

glBegin(GL_LINES); //画出线段

glVertex2d(P[0].x,P[0].y);

glVertex2d(P[m_N-1].x,P[m_N-1].y);

glEnd();//结束画线段

return; //递归到了最底层,跳出递归

}



myPOINT2D Q[MAX],R[MAX];



for(i=0;i<m_N;i++)

{

Q[i].x=P[i].x;

Q[i].y=P[i].y;

}



for(i=1;i<m_N;i++)

{

R[m_N-i].x=Q[m_N-1].x;



R[m_N-i].y=Q[m_N-1].y;



for(j=m_N-1;j>=i;j--)

{

Q[j].x=(Q[j-1].x+Q[j].x)/double(2);

Q[j].y=(Q[j-1].y+Q[j].y)/double(2);

}

}



R[0].x=Q[m_N-1].x;

R[0].y=Q[m_N-1].y;



bezier_generation(Q,level);

bezier_generation(R,level);

}



void CBezierCurve::myPolygon()

{



glBegin(GL_LINE_STRIP); //画出连线段

glColor3f(0.2f,0.4f,0.4f);

for(int i=0;i<m_N;i++)

{

glVertex2d(m_Vertex[i].x,m_Vertex[i].y);

}

glEnd();//结束画连线段



}
jerkzzz 2003-05-06
  • 打赏
  • 举报
回复
我照着做了没有问题。我把view和BezierCurve代码贴出,你进行替换好了。
1、
// BezierCurve.h: interface for the CBezierCurve class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_BEZIERCURVE_H__2DBEDF7C_A5E9_48E8_A0B4_8F462FDC3572__INCLUDED_)
#define AFX_BEZIERCURVE_H__2DBEDF7C_A5E9_48E8_A0B4_8F462FDC3572__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define MAX 50
#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>
struct myPOINT2D{
GLdouble x,y;
};

class CBezierCurve
{

public:

CBezierCurve();

virtual ~CBezierCurve();



void bezier_generation(myPOINT2D P[MAX],int level);

//算法的具体实现

void myDraw();//画曲线函数



public:

void myPolygon(); //画控制多边形

myPOINT2D m_Vertex[MAX];//控制顶点,以数组存储

//myPOINT2D 是一个存二维点的结构

//成员为Gldouble x,y

int m_N; //控制顶点的个数

};

#endif // !defined(AFX_BEZIERCURVE_H__2DBEDF7C_A5E9_48E8_A0B4_8F462FDC3572__INCLUDED_)
0aaron 2003-05-05
  • 打赏
  • 举报
回复
我没有做过OPENGL,真的不好意思,帮不了你,

不过,如果你想找一些这方面的算法,你可以找一些计算机图形的书看看,它会介绍一些算法,不是通过API调用,而是直接用算法利用点来生成图形的。
shilong 2003-05-05
  • 打赏
  • 举报
回复
发了一份相关的源码给你
mymmsc 2003-05-05
  • 打赏
  • 举报
回复
啊?!!
z4b 2003-05-05
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1737/1737257.xml?temp=.507229

老大,给我作个,发给我吧,求你了。

z4b@163.com

捆饶我好几天了。老大们求你们 了。
shilong 2003-05-04
  • 打赏
  • 举报
回复
晕,你真难,现在的代码都懒得调试
我有空再帮你看看吧~冲星星ing...
z4b 2003-05-04
  • 打赏
  • 举报
回复
附录:

1.CBezierCurve 的声明: (BezierCurve.h)

class CBezierCurve

{

public:

CBezierCurve();

virtual ~CBezierCurve();



void bezier_generation(myPOINT2D P[MAX],int level);

//算法的具体实现

void myDraw();//画曲线函数



public:

void myPolygon(); //画控制多边形

myPOINT2D m_Vertex[MAX];//控制顶点,以数组存储

//myPOINT2D 是一个存二维点的结构

//成员为Gldouble x,y

int m_N; //控制顶点的个数

};



2. CBezierCurve 的实现: (BezierCurve.cpp)



CBezierCurve::CBezierCurve()

{

m_N=4;

m_Vertex[0].x=-0.5f;

m_Vertex[0].y=-0.5f;

m_Vertex[1].x=-0.5f;

m_Vertex[1].y=0.5f;

m_Vertex[2].x=0.5f;

m_Vertex[2].y=0.5f;

m_Vertex[3].x=0.5f;

m_Vertex[3].y=-0.5f;

}



CBezierCurve::~CBezierCurve()

{



}

void CBezierCurve::myDraw()

{

bezier_generation(m_Vertex,LEVEL);

}



void CBezierCurve::bezier_generation(myPOINT2D P[MAX], int level)

{ //算法的具体描述,请参考相关书本

int i,j;



level--;



if(level<0)return;



if(level==0) //不要写成level=0!!!

{

glColor3f(1.0f,1.0f,1.0f);

glBegin(GL_LINES); //画出线段

glVertex2d(P[0].x,P[0].y);

glVertex2d(P[m_N-1].x,P[m_N-1].y);

glEnd();//结束画线段

return; //递归到了最底层,跳出递归

}



myPOINT2D Q[MAX],R[MAX];



for(i=0;i<m_N;i++)

{

Q[i].x=P[i].x;

Q[i].y=P[i].y;

}



for(i=1;i<m_N;i++)

{

R[m_N-i].x=Q[m_N-1].x;



R[m_N-i].y=Q[m_N-1].y;



for(j=m_N-1;j>=i;j--)

{

Q[j].x=(Q[j-1].x+Q[j].x)/double(2);

Q[j].y=(Q[j-1].y+Q[j].y)/double(2);

}

}



R[0].x=Q[m_N-1].x;

R[0].y=Q[m_N-1].y;



bezier_generation(Q,level);

bezier_generation(R,level);

}



void CBezierCurve::myPolygon()

{



glBegin(GL_LINE_STRIP); //画出连线段

glColor3f(0.2f,0.4f,0.4f);

for(int i=0;i<m_N;i++)

{

glVertex2d(m_Vertex[i].x,m_Vertex[i].y);

}

glEnd();//结束画连线段



}

*************本文结束****************************



----


QQ: 41733842
Ewail: z4b@163.com

--

z4b 2003-05-04
  • 打赏
  • 举报
回复
6. 处理 OnSize()



void CTestView::OnSize(UINT nType, int cx, int cy)

{

CView::OnSize(nType, cx, cy);



VERIFY(wglMakeCurrent(m_pDC->m_hDC,m_hRC));//确认RC与当前DC关联

GLResize(cx, cy);//具体的响应 WM_SIZE 消息,对投影进行修正



VERIFY(wglMakeCurrent(NULL,NULL));//确认DC释放RC

}



void GLResize(GLsizei w, GLsizei h) //GLResize() 是一个全局函数

{

// Prevent a divide by zero

if(h == 0)

h = 1;



glViewport(0, 0, w, h); //设置视口



glMatrixMode(GL_PROJECTION);//进入投影变换状态

glLoadIdentity();



//重新进行投影变换

gluPerspective (20.0f, (GLdouble)w/(GLdouble)h, 1.0, 40.0f);

glMatrixMode(GL_MODELVIEW);//结束投影变换

glLoadIdentity();

}



7 处理 OnLButtonDown()



void CTestView::OnLButtonDown(UINT nFlags, CPoint point)

{

CView::OnLButtonDown(nFlags, point);



if(bezier_curve.m_N>MAX-1)

{

MessageBox("顶点个数超过了最大数MAX=50");

return;

}



//以下为坐标变换作准备,

//说明:OpenGL 有一个更有力处理方式,即用 gluUnProject()

//这里为了证券交易起见,自己处理。

GetClientRect(&m_ClientRect);//获取视口区域大小

w=m_ClientRect.right-m_ClientRect.left;//视口宽度 w

h=m_ClientRect.bottom-m_ClientRect.top;//视口高度 h

//w,h 是CTestView的成员变量

centerx=(m_ClientRect.left+m_ClientRect.right)/2;//中心位置,

centery=(m_ClientRect.top+m_ClientRect.bottom)/2;//取之作原点

//centerx,centery 是 CTestView 的成员变量

GLdouble tmpx,tmpy;

tmpx=scrx2glx(point.x);//屏幕上点坐标转化为OpenGL画图的规范坐标

tmpy=scry2gly(point.y);



bezier_curve.m_Vertex[bezier_curve.m_N].x=tmpx;//加一个顶点

bezier_curve.m_Vertex[bezier_curve.m_N].y=tmpy;



bezier_curve.m_N++;//顶点数加一

InvalidateRect(NULL,TRUE);//发送刷新重绘消息

}





double CTestView::scrx2glx(int scrx) //可能有毛病,因为点到的位置总

{ //总画不到,望指正

return (double)(scrx-centerx)/double(h);

}



double CTestView::scry2gly(int scry)

{

return (double)(centery-scry)/double(h);

}

z4b 2003-05-04
  • 打赏
  • 举报
回复
3. 处理 OnDestroy()



void CTestView::OnDestroy()

{

wglMakeCurrent(m_pDC->m_hDC,NULL); //释放与m_hDC 对应的 RC

wglDeleteContext(m_hRC); //删除 RC



if (m_pDC)

delete m_pDC; //删除当前 View 拥有的 DC



CView::OnDestroy();

}



4. 处理 OnEraseBkgnd()



BOOL CTestView::OnEraseBkgnd(CDC* pDC)

{

// TODO: Add your message handler code here and/or call default



// return CView::OnEraseBkgnd(pDC);//把这句话注释掉,若不然,Window

//会用白色北景来刷新,导致画面闪烁

return TRUE;//只要空返回即可。

}



5. 处理 OnDraw()



void CTestView::OnDraw(CDC* pDC)

{

wglMakeCurrent(m_pDC->m_hDC,m_hRC);//使 RC 与当前 DC 相关联



DrawScene( ); //具体的绘图函数,在 RC 中绘制

SwapBuffers(m_pDC->m_hDC);//把 RC 中所绘传到当前的 DC 上,从而

//在屏幕上显示

wglMakeCurrent(m_pDC->m_hDC,NULL);//释放 RC,以便其它 DC 进行绘图

}



void CTestView::DrawScene( )

{

glClearColor(0.0f,0.0f,0.0f,1.0f);//设置背景颜色为黑色

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glPushMatrix();



glTranslated(0.0f,0.0f,-3.0f);//把物体沿(0,0,-1)方向平移

//以便投影时可见。因为缺省的视点在(0,0,0),只有移开

//物体才能可见。

//本例是为了演示平面 Bezier 曲线的,只要作一个旋转

//变换,可更清楚的看到其 3D 效果。

//如?glRotated(30,1.0f,0.0f,0.0f); //绕 X 轴转 30 度

// glRotated(30,0.0f,1.0f,0.0f); //绕 Y 轴转 30 度



glBegin(GL_LINES);//画坐标系,由三条线段组成

glColor3f(1,0,0);

glVertex3f(0,0,0);

glVertex3f(1,0,0);//X坐标



glColor3f(0,1,0);

glVertex3f(0,0,0);

glVertex3f(0,1,0);//Y坐标



glColor3f(0,0,1);

glVertex3f(0,0,0);

glVertex3f(0,0,1);//Z坐标

glEnd();//end draw the 3D axis



//下面画一条 Bezier 曲线

bezier_curve.myPolygon();//画Bezier曲线的控制多边形



bezier_curve.myDraw(); //CBezierCurve bezier_curve

//是 CTestView 的成员变量

//具体的函数见附录



glPopMatrix();

glFinish(); //结束 RC 绘图

return;

}

z4b 2003-05-04
  • 打赏
  • 举报
回复
五、设置 OpenGL 工作环境:(下面各个操作,均针对 TestView.cpp )



1. 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格



cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC;



2. 处理 OnCreate():创建 OpenGL 的绘图设备。 OpenGL 绘图的机制

是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )

把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的

绘图上下文 Device Context (简记为 DC).要注意的是,程序运行

过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图

后,要立即释放 RC,以便其它的 DC 也使用。在后面的代码中,将有

详细注释。



int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;



Init();

return 0;

}



void CTestView::Init()

{

m_pDC = new CClientDC(this); //创建 DC



ASSERT(m_pDC != NULL);



if (!bSetupPixelFormat()) //设定绘图的位图格式,函数下面列出

return;



m_hRC = wglCreateContext(m_pDC->m_hDC);//创建 RC

wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 与当前 DC 相关联

} //CClient * m_pDC; HGLRC m_hRC; 是 CTestView 的成员变量



BOOL CTestView::bSetupPixelFormat()

{

static PIXELFORMATDESCRIPTOR pfd =

{

sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd

1, // version number

PFD_DRAW_TO_WINDOW | // support window

PFD_SUPPORT_OPENGL | // support OpenGL

PFD_DOUBLEBUFFER, // double buffered

PFD_TYPE_RGBA, // RGBA type

24, // 24-bit color depth

0, 0, 0, 0, 0, 0, // color bits ignored

0, // no alpha buffer

0, // shift bit ignored

0, // no accumulation buffer

0, 0, 0, 0, // accum bits ignored

32, // 32-bit z-buffer

0, // no stencil buffer

0, // no auxiliary buffer

PFD_MAIN_PLANE, // main layer

0, // reserved

0, 0, 0 // layer masks ignored

};

int pixelformat;



if ( (pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 )

{

MessageBox("ChoosePixelFormat failed");

return FALSE;

}



if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE)

{

MessageBox("SetPixelFormat failed");

return FALSE;

}



return TRUE;

}

fzx 2003-05-04
  • 打赏
  • 举报
回复
找本书系统地学一下吧,光看代码恐怕进步不够快。
我在做opengl,很容易入门,但要做好还是不容易的,
vc做这方面的东西有固定的框架
建议你多看看这个网站的:http://nehe.gamedev.net/
还有 :http://www.opengl.org
csdn的个人专栏里有nehe的中文译本
fzx 2003-05-04
  • 打赏
  • 举报
回复
oncreat 是响应 视图类的 WM_CREAT消息的自定义函数, 在classwizard 中添加
Skt32 2003-05-04
  • 打赏
  • 举报
回复
z4b@163.com 这个邮箱?
发了一个,你自己看吧,别人的,我没有调过
Skt32 2003-05-04
  • 打赏
  • 举报
回复
发了
nuaawenlin 2003-05-04
  • 打赏
  • 举报
回复
我现在也在做,不过使用C++很简单就可以做出来了,不过使用MFC 就很难作出,我现在也没解决,可能也就是没有将窗口和设备关联吧
加载更多回复(2)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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