appwizard 编程实现( vc++ )

27
AppWizard 编编编编VC++

Upload: marly

Post on 13-Jan-2016

137 views

Category:

Documents


0 download

DESCRIPTION

AppWizard 编程实现( VC++ ). 一、 使用 AppWizard 建立一个新的 MDI 程序. 第一步 : 启动 VC ++,打开菜单 并选择 ,出现对话框 第二步 :在对话框上 Projects 选项卡中选择 MFC AppWizard (.exe) 选项。在右边的 Project Name 栏中键入项目名称***,并在 Location 栏中键入待生成的项目位置,单击 OK 按钮,出现 MFC AppWizard_step 1 对话框 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: AppWizard 编程实现( VC++ )

AppWizard 编程实现( VC++ )

Page 2: AppWizard 编程实现( VC++ )

一、 使用 AppWizard 建立一个新的 MDI 程序

第一步:启动 VC ++,打开菜单 <File> 并选择 <New> ,出现对话框

第二步:在对话框上 Projects 选项卡中选择 MFC AppWizard (.exe) 选项。在右边的 Project Name 栏中键入项目名称 *** ,并在 Location 栏中键入待生成的项目位置,单击 OK 按钮,出现MFC AppWizard_step 1 对话框

第三步:在对话框中选择 Multiple documents 项,用于生成多文档界面,单击 Next 按钮,可得 MFC AppWizard_step 2 of 6

第四步:使用缺省项,继续单击 Next 按钮,在最后一步出现 MFC AppWizard_step 6 of 6

第五步: AppWizard 自动生成了 C***App , C***Doc , C***View , CChildFrame , CMainFrame 类,单击 Finish 按钮, AppWizard 最后给出新生成项目的一些信息,单击 OK 按钮,完成 MDI 建构

Page 3: AppWizard 编程实现( VC++ )

第一步界面

Page 4: AppWizard 编程实现( VC++ )

第二步界面

Page 5: AppWizard 编程实现( VC++ )

二、连接 OpenGL 函数库

需要在所创建项目中加入的三个函数库opengl32.libglu32.libglaux.lib

连接库文件打开Project菜单,选择 <Add to Project> ,从中找到 <Fil

e> 选项,出项 Insert Files into Project 对话框找到 VC 安装目录,如 c:\Program Files\Microsoft Visual Studio\Vc98 ,选取 Lib 目录,从中选取 opengl32.lib , glu32.lib , glaux.lib 库文件,单击 OK ,加入到应用程序库项目中。

Page 6: AppWizard 编程实现( VC++ )

连接库文件

Page 7: AppWizard 编程实现( VC++ )

Insert Files into Project 对话框

Page 8: AppWizard 编程实现( VC++ )

#include <gl\gl.h>#include <gl\glu.h>#include <gl\glaux.h>

在所创建的视图类头文件中添加下面三个头文件

Page 9: AppWizard 编程实现( VC++ )

// Attributespublic: CGraphic1Doc* GetDocument();public: HGLRC hglrc; //RC 句柄

Page 10: AppWizard 编程实现( VC++ )

// Implementation public: virtual ~CGraphic1View(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif

protected: void myinit(); // 自定义初始化函数 void display(); // 自定义的绘图函数

Page 11: AppWizard 编程实现( VC++ )

WM_CREATWM_DESTORYWM_SIZE

Page 12: AppWizard 编程实现( VC++ )

PIXELFORMATDESCRIPTOR pfd={ sizeof(PIXELFORMATDESCRIPTOR), //sizeof this pfd 1,

PFD_DRAW_TO_WINDOW| //support window

PFD_SUPPORT_OPENGL| //support OpenGL

PFD_DOUBLEBUFFER, //double buffered

PFD_TYPE_RGBA, //RGBA type

24, //24-bit color

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

0, //no alpha buffer

0, //shift bit ignored

0, //no accumulation buffer

设置像素格式参数

Page 13: AppWizard 编程实现( VC++ )

0,0,0,0, //accum bits ignored32, //32-bit depth-buffer0, //no stencil buffer0, //no auxiliary bufferPFD_MAIN_PLANE, //main layer0, //reserved0,0,0 //layer masks ignored };

Page 14: AppWizard 编程实现( VC++ )

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

// TODO: Add your specialized creation code here // 设置好像素格式后,添加下列语句 // 获取当前 DC 句柄 CClientDC clientdc(this); // 返回最佳匹配的象素格式 int pf=ChoosePixelFormat(clientdc.m_hDC,&pfd); // 设置象素格式 BOOL rt=SetPixelFormat(clientdc.m_hDC,pf,&pfd); //create rendering context

hglrc=wglCreateContext(clientdc.m_hDC);

return 0; }

Page 15: AppWizard 编程实现( VC++ )

void CGraphicView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy);

// TODO: Add your message handler code here int width=cx; int height=cy; CClientDC clientdc(this); wglMakeCurrent (clientdc.m_hDC,hglrc); glViewport(0,0,width,height);// 重新设置视口 wglMakeCurrent(NULL,NULL); }

Page 16: AppWizard 编程实现( VC++ )

void CGraphicView::OnDestroy() { CView::OnDestroy();

// TODO: Add your message handler code here

wglDeleteContext(hglrc);

}

Page 17: AppWizard 编程实现( VC++ )

void CGraphicView::OnDraw(CDC* pDC) { CGraphicDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here wglMakeCurrent(pDC->m_hDC,hglrc);// 设置一个线程

的当前绘图描述表 display(); wglMakeCurrent(pDC->m_hDC,NULL);// 释放绘图描

述表 // 所使用的设备描述表,并忽略设备描述表句柄 pDC-/

/>m_hDC SwapBuffers(pDC->m_hDC);// 交换前后缓冲区 }

Page 18: AppWizard 编程实现( VC++ )

void CGraphicView::display() { myinit(); int ii;

double *coordX=new double[100]; double *coordY=new double [100];float scaleX=0.05f; float scaleY=0.05f;glPushMatrix(); //sin functionglColor3f(0.0f,0.0f,1.0f);glPushMatrix();glTranslatef(-0.9f,0.6f,0); glPointSize(2.0);// 点尺寸大小glBegin(GL_POINTS);int numPnt=25;for(ii=0;ii<=numPnt-1;ii++){

coordX[ii]=ii*2*PI/numPnt;coordY[ii]=2*sin(2*coordX[ii]);glVertex2d(coordX[ii]*scaleX,coordY[ii]*scaleY);

}glEnd();glPopMatrix(); glPopMatrix();delete coordX; delete coordY;

// 强制绘图,不驻留缓存glFlush();

}

Page 19: AppWizard 编程实现( VC++ )

void CFirstOpenGLView::myinit() { // 设置背景色 //glColor4f(0.0,0.5f,0.7f,0.0);//BLUE glColor4f(1.0,1.0,1.0,0.0);//WHITE // 清除颜色缓冲区 glClear(GL_COLOR_BUFFER_BIT); //glClear(GL_COLOR_BUFFER_BIT|GL

_DEPTH_BUFFER_BIT);

}

Page 20: AppWizard 编程实现( VC++ )

//drawing lines glColor3f(1.0f,0.0f,0.0f); glPushMatrix(); glTranslatef(-0.55f,0.6f,0); glLineWidth(3.0);// 线宽 glLineStipple(1,0x1F83);// 线型 glBegin(GL_LINES); glVertex2d(0.0*scaleX,0.0*scaleY); glVertex2d(5.0*scaleX,0.0*scaleY); glVertex2d(0.0*scaleX,0.8*scaleY); glVertex2d(5.0*scaleX,0.8*scaleY); glVertex2d(1.0*scaleX,-0.5*scaleY); glVertex2d(1.0*scaleX,1.3*scaleY); glVertex2d(4.0*scaleX,-0.5*scaleY); glVertex2d(4.0*scaleX,1.3*scaleY); // glVertex2d(0.0*scaleX,-0.5*scaleY); glVertex2d(0.0*scaleX,-1.3*scaleY); glVertex2d(0.0*scaleX,-0.5*scaleY); glVertex2d(2.2*scaleX,-0.5*scaleY); glVertex2d(2.2*scaleX,-0.5*scaleY); glVertex2d(2.2*scaleX,-1.3*scaleY); glVertex2d(0.0*scaleX,-1.3*scaleY); glVertex2d(2.2*scaleX,-1.3*scaleY);

Page 21: AppWizard 编程实现( VC++ )

//glVertex2d(2.8*scaleX,-0.5*scaleY);glVertex2d(2.8*scaleX,-1.3*scaleY);glVertex2d(2.8*scaleX,-0.5*scaleY);glVertex2d(5.0*scaleX,-0.5*scaleY);glVertex2d(5.0*scaleX,-0.5*scaleY);glVertex2d(5.0*scaleX,-1.3*scaleY);glVertex2d(2.8*scaleX,-1.3*scaleY);glVertex2d(5.0*scaleX,-1.3*scaleY);//glVertex2d(0.0*scaleX,-1.8*scaleY);glVertex2d(5.0*scaleX,-1.8*scaleY);glVertex2d(1.0*scaleX,-2.3*scaleY);glVertex2d(1.0*scaleX,-1.3*scaleY);glVertex2d(4.0*scaleX,-2.3*scaleY);glVertex2d(4.0*scaleX,-1.3*scaleY);

Page 22: AppWizard 编程实现( VC++ )

//glVertex2d(0.0*scaleX,-2.3*scaleY);glVertex2d(0.0*scaleX,-3.1*scaleY);glVertex2d(0.0*scaleX,-2.3*scaleY);glVertex2d(2.2*scaleX,-2.3*scaleY);glVertex2d(2.2*scaleX,-2.3*scaleY);glVertex2d(2.2*scaleX,-3.1*scaleY);glVertex2d(0.0*scaleX,-3.1*scaleY);glVertex2d(2.2*scaleX,-3.1*scaleY);

//glVertex2d(2.8*scaleX,-2.3*scaleY);

glVertex2d(2.8*scaleX,-3.1*scaleY);glVertex2d(2.8*scaleX,-2.3*scaleY);glVertex2d(5.0*scaleX,-2.3*scaleY);glVertex2d(5.0*scaleX,-2.3*scaleY);glVertex2d(5.0*scaleX,-3.1*scaleY);glVertex2d(2.8*scaleX,-3.1*scaleY);glVertex2d(5.0*scaleX,-3.1*scaleY);glEnd();glPopMatrix();

Page 23: AppWizard 编程实现( VC++ )

void CFirstOpenGLView::BresenhamCircle(int R)

{

int x,y,delta,delta1,delta2,direction; delta1=0;delta2=0; float scaleX=0.05f; float scaleY=0.05f; glColor3f(0.0f,0.0f,1.0f); glPushMatrix(); glTranslatef(-0.9f,0.6f,0); glPointSize(5.0);// 点尺寸大小

Page 24: AppWizard 编程实现( VC++ )

x=0; y=R; delta=2*(1-R); while(y>=0) { glBegin(GL_POINTS); glVertex2d(x*scaleX,y*s

caleY);

glEnable(GL_POINT_SMOOTH);

glEnd();

Page 25: AppWizard 编程实现( VC++ )

if(delta<0) { delta1+=(2*(delta+y)-1); if(delta1<=0)direction=1; else direction=2; } else if(delta>0) { delta2+=2*(delta-x)-1; if(delta2<=0)direction=2; else direction=3; } else direction=2;

Page 26: AppWizard 编程实现( VC++ )

switch(direction) { case 1: x++; delta+=2*x+1; break; case 2: x++; y--; delta+=2*(x-y+1); break; case 3: y--; delta+=(-2*y+1); break; }//switch }//while glPopMatrix(); glFlush(); }

Page 27: AppWizard 编程实现( VC++ )

上机考试题目(任选其一)上机实现 Cohen-Sutherland 线段裁剪算

上机实现一种区域填充算法

上机完成生成圆弧的各种算法