搜档网
当前位置:搜档网 › 第1章 VC++绘图程序设计chengxu

第1章 VC++绘图程序设计chengxu

第1章 VC++绘图程序设计chengxu
第1章 VC++绘图程序设计chengxu

【例1-9】绘制一个三维空间中的线框立方体图。

在OnDraw函数中加入下面语句,就能够绘制出如图1-15所示的线框立方体图形。

pDC->MoveTo(80,80);

pDC->LineTo(180,80);

pDC->LineTo(220,30);

pDC->LineTo(120,30);

pDC->LineTo(80,80);

pDC->LineTo(80,180);

pDC->LineTo(180,180);

pDC->LineTo(220,130);

pDC->LineTo(220,30);

pDC->MoveTo(180,80);

pDC->LineTo(180,180);

【例1-11】设计程序,按下上下左右键移动图形。

首先建立单文档项目,命名为draw。

在文件drawView.cpp各个函数定义的前面加入下面全局变量的定义,

int x; int y; CPoint pt; CString str;

在OnDraw函数中加入下面语句:

CBrush brush,*oldbrush;

brush.CreateSolidBrush(RGB(x+50,y+100,x+y));

oldbrush=pDC->SelectObject(&brush);

pDC->Ellipse(x+100,y+100,x,y);

pDC->SelectObject(oldbrush);

pDC->TextOut(pt.x+10,pt.y+10,"请使用键盘的上、下、左、右键控制小球移动!");

pDC->TextOut(pt.x+10,pt.y-10,str);

参考图1-16加入OnKeyDown事件函数,在该函数中添加下面代码,加入代码后如图1-20所示。

switch(nChar)

{

case VK_LEFT: {x-=10; pt.x=x;} break;

case VK_RIGHT: {x+=10; pt.x=x;} break;

case VK_UP: {y-=10; pt.y=y;} break;

case VK_DOWN: {y+=10; pt.y=y;} break;

}

Invalidate();

【例1-15】在指定位置输出文字。

首先建立一个单文档项目,项目名为File1,然后打开Source Files文件夹中的视图文件CFile1View.Cpp,在OnDraw函数中写上语句,如下面程序中阴影部分所示。

void CFile1View::OnDraw(CDC* pDC)

{

CFile1Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CString s1,s2,s3;

s1="先生们,女士们,朋友们";

s2="大家好!";

s3="大家上午好!";

pDC->TextOut(60,30,s1);

pDC->TextOut(60,80,s2);

pDC->TextOut(60,130,s3);

}

【例1-16】沿轨道输出一些字符。

例1-4实现了点沿着正弦曲线运动的动画,下面修改该程序,实现一些字符或者小图形沿着正弦曲线逐个输出。

把下面程序写入单文档程序的OnDraw函数中,运行后出现动画效果。

char s[12]={96,97,98,'d','e','f','g','h','i','j','k','l'};

int k=0;

for(int i=0;i<628;i=i+50)

{

int y=100*sin(float(i)/100);

pDC->SetTextColor(i*100); //设置字体颜色

pDC->TextOut(i,y+120,s[k]);

k++;

Sleep(50);

}

【例1-17】画笔对象与指向画笔对象的指针。

与本章前面一些例题一样,把下面程序嵌入到OnDraw函数中,绘制出的图形如图1-33所示。

CPen myPen,*pCPen;

int i,y;

for(y=i=0;i<5;++i)

{

myPen.CreatePen(i,0,RGB(0,0,225));

pCPen=pDC->SelectObject(&myPen);

y+=10;

pDC->MoveTo(10,y);

pDC->LineTo(100,y);

pDC->SelectObject(pCPen);

myPen.DeleteObject();

}

【例1-18】修改程序,深入理解画笔的使用。

把上面例1-17中程序段修改为下面所示,结果如图1-34所示。

CPen myPen;

int i,y;

for(y=i=0;i<5;++i)

{

myPen.CreatePen(i,i,RGB(0,0,225));

pDC->SelectObject(&myPen);

y+=10;

pDC->Ellipse(12,56,100+y,150+y);

myPen.DeleteObject();

}

【例1-20】使用画刷绘制填充椭圆,制作动画。

pDC->MoveTo(10,100);

for(int i=10;i<20;i++)

{

CBrush b(RGB(255,0,i*12));

pDC->SelectObject(&b);

pDC->Ellipse(i+100,i+100,i*20,i*20);

Sleep(100);

}

【例1-21】取位图上一个点的颜色值。

1.新建一个单文档工程,名为a1,在其视图文件中的OnDraw函数中添加代码(阴影部分为添加的代码),如下所示:

void CA1View::OnDraw(CDC* pDC)

{

CA1Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CBitmap b;

CDC d;

b.LoadBitmap(B1);

d.CreateCompatibleDC(pDC);

d.SelectObject(&b);

pDC->BitBlt(5,5,300,300,&d,1,1,SRCCOPY);

/*unsigned k;

k=pDC->GetPixel(15,15);

char s[32];

sprintf(s,"%f",k);

pDC->TextOut(60,60,CString(s));*/

//cout<

}

【例1-22】获取位图图像的多个颜色值。

添加位图方法与例1-21相同,添加后也命名该位图为B1。

添加OnDraw函数如下:

void CA1View::OnDraw(CDC* pDC)

{

CA1Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CBitmap b;

CDC d;

b.LoadBitmap(B1);

d.CreateCompatibleDC(pDC);

d.SelectObject(&b);

pDC->BitBlt(5,5,300,300,&d,1,1,SRCCOPY);

unsigned k;

for(int i=1;i<100;i=i+5)

for(int j=1;j<100;j=j+5)

{

k=pDC->GetPixel(i,j);

char s[32];

sprintf(s,"%d",k);

pDC->TextOut(i*15,j*5,CString(s));

}

}

【例1-23】一个小圆圈向下坠落。

把下面程序写入单文档项目的OnDraw中,

pDC->MoveTo(100,10); //小圆的下落地点

int k=1; //k是为了增大步长而用

for(int i=10;i<250;i=i+k*4.9) //步长越来越大,而每次绘制的时间间隔不变{

pDC->Ellipse(100,10+i,150,60+i);

Sleep(100);

k++;

}

把程序段修改为下面所示:

CPen p1,p2; //设置了两个画笔对象

p1.CreatePen(1,1,RGB(0,0,0)); // 黑色画笔,为了好的显示效果,线型设为虚线p2.CreatePen(1,1,RGB(255,255,225)); // 白色画笔

pDC->MoveTo(100,10);

int k=1;

for(int i=10;i<250;i=i+k*4.9)

{

pDC->SelectObject(&p1); //选择黑色画笔绘制小圆圈

pDC->Ellipse(100,10+i,150,60+i);

Sleep(100);

pDC->SelectObject(&p2); //选择白色画笔,擦除小圆圈

pDC->Ellipse(100,10+i,150,60+i);

k++;

}

【例1-24】小圆从上到下运动。

上面例1-23中是一个小圆圈逐渐下落,这个例题是实现了一个小填充圆逐渐下落。

把下面程序段写入OnDraw函数,可以实现一个小红色(填充)圆自上而下运动,其运动速度越来越快。

CBrush b1(RGB(255,0,0)); //定义并创建画刷,颜色为红色

CBrush b2(RGB(255,255,255));

CPen p;

p.CreatePen(1,0,RGB(255,255,225)); //把画笔设为白色,小圆没有(看不到)边界pDC->SelectObject(&p); //选择画笔后不再改变

pDC->MoveTo(100,10);

int k=1;

for(int i=10;i<250;i=i+k*4.9)

{

pDC->SelectObject(&b1); //选择画刷b1绘制红色小圆

pDC->Ellipse(100,10+i,150,60+i);

Sleep(100);

pDC->SelectObject(&b2); //选择画刷b2绘制白色小圆,就相当于擦除

pDC->Ellipse(100,10+i,150,60+i);

k++;

}

【例1-25】小圆从上到下运动,再从下到上弹起。

把下面程序写入单文档项目的OnDraw中,

CBrush b1(RGB(255,0,0));

CBrush b2(RGB(255,255,255));

CPen p;

p.CreatePen(1,0,RGB(255,255,225));

pDC->SelectObject(&p);

pDC->MoveTo(100,10);

int k=1;int t=1;int i,r;

while(t<4)

{

for(i=10;i<250;i=i+k*4.9)

{

pDC->SelectObject(&b1);

pDC->Ellipse(100,10+i,150,60+i);

Sleep(100);

pDC->SelectObject(&b2);

pDC->Ellipse(100,10+i,150,60+i);

k++;

}

for(r=i;r>0;r=r-k*4.9)

{

pDC->SelectObject(&b1);

pDC->Ellipse(100,10+r,150,60+r);

Sleep(100);

pDC->SelectObject(&b2);

pDC->Ellipse(100,10+r,150,60+r);

k--;

}

t++;

}

【例1-26】模拟物体平抛运动。

建立单文档项目,首先,在视图文件的OnDraw函数中写入一个自编函数,如下所示:void paintBall(int x,int y,int r,CDC *pDC)

{

double w,u,d; int R=0,G=0,B=0;

w=r;d=w/255;

while(w>=0) //循环嵌套,里层循环是绘制一个圆,外层循环是绘制半径不同的圆{

for(u=0;u<=628;u=u+1) //使用参数方程绘圆

{ // x与y是球心(圆心)位置

pDC->SetPixel((int)(x+w*cos(u/100)),(int)(y+(w*sin(u/100))),RGB(R,G,B));

}

R++;G++;B++; //每次颜色值分量增加,点变亮

w=w-d; //每次半径变小,圆逐渐向里面绘制

}

}

该函数就是例1-7绘制真实感球的函数,在这里,就是要让“这个”小球实现平抛运动。

加入该函数后,把下面语句写入OnDraw函数中。

for(int t=1;t<280;t=t+20)

{

int r=20;

int x,y;

x=t;y=0.5*9.8*t*t/1000;

paintBall(x,y,r,pDC);

}

绘制小球的函数不变,把写入OnDraw函数中的程序段修改如下:

for(int t=1;t<280;t=t+20)

{

int r=20;

int x,y;

x=t;y=0.5*9.8*t*t/1000;

paintBall(x,y,r,pDC);

Sleep(100);

pDC->FillSolidRect(x-r,y-r,2*r,2*r,256*256*256-1);

}

【例1-27】把小球做成图片,然后操作该位图图像,制作小球平抛动画。

首先,把小球做成bmp文件,然后使用例1-20的方法把小球bmp文件导入到项目中,存储在其Resource目录下的Bitmap文件夹中,自动命名为IDB_BITMAP1(不改动)。

再把下面程序段放在OnDraw函数中,

CBitmap b;

CDC d;

b.LoadBitmap(IDB_BITMAP1);

d.CreateCompatibleDC(pDC);

d.SelectObject(&b);

for(int t=1;t<280;t=t+20)

{

int r=20;

int x,y;

x=t;y=0.5*9.8*t*t/1000;

pDC->BitBlt(x,y,300,300,&d,1,1,SRCCOPY);

}

把上面程序修改为下面所示,运行后出现一个小球做抛物运动的动画效果。

CBitmap b;

CDC d;

b.LoadBitmap(IDB_BITMAP1);

d.CreateCompatibleDC(pDC);

d.SelectObject(&b);

for(int t=1;t<280;t=t+20)

{

int r=20;

int x,y;

x=t;y=0.5*9.8*t*t/1000;

pDC->BitBlt(x,y,300,300,&d,1,1,SRCCOPY);

Sleep(100);

pDC->FillSolidRect(x,y,51,50,256*256*256-1); //绘制白色背景擦除}

【例1-28】设计程序,制作模拟小圆在空间中螺旋上升的动画。

把下面程序段写入单文档程序的OnDraw函数中,

CBrush b1(RGB(0,0,0));

CBrush b2(RGB(255,255,255));

CPen p;

CPoint pt;

p.CreatePen(1,0,RGB(255,255,225)); pDC->SelectObject(&p);

float i,x,y,l,j;

float k=0;

for(i=0;i<25;i=i+0.1)

{

l=0;

for(j=0;j<25;j=j+0.02)

{

x=200-90*sin(j);

y=200-40*cos(j)-l;

pt.x=x;

pt.y=y;

pDC->SetPixel(pt,RGB(255,0,0));

l=l+0.1;

}

x=200-90*sin(i);

y=200-40*cos(i)-k;

pDC->SelectObject(&b1);

pDC->Ellipse(x-20,y-20,x+20,y+20);

Sleep(30);

pDC->SelectObject(&b2);

pDC->Ellipse(x-20,y-20,x+20,y+20);

k=k+0.5;

}

【例1-29】设计程序,制作模拟小球在空间中螺旋上升的动画。

设计绘制小球的函数如下,放在OnDraw函数的上面。

void paintBall(int x,int y,int r,CDC *pDC)

{

double w,u,d; int R=0,G=0,B=0;

w=r;d=w/255;

while(w>=0)

{

for(u=0;u<=628;u=u+1)

{

pDC->SetPixel((int)(x+w*cos(u/100)),(int)(y+(w*sin(u/100))),RGB(R,G,B));

}

R++;G++;B++;

w=w-d*2;

}

}

在OnDraw函数中写入下面代码:

double x,y,i,x1,y1,j;

for(i=0;i<=31.3;i+=0.001)

{

x=5*cos(i)*30+300;

y=4*sin(i)*30+100+8*i;

pDC->SetPixel((int)x,(int)y,RGB(0,255,0));

}

for(i=0;i<31.3;i+=0.1)

{

x=5*cos(i)*30+300;

y=4*sin(i)*30+100+8*i;

paintBall(x,y,10,pDC);

pDC->FillSolidRect(x-10,y-10,21,20,256*256*256-1);

for(j=0;j<=31.3;j+=0.001)

{

x1=5*cos(j)*30+300;

y1=4*sin(j)*30+100+8*j;

pDC->SetPixel((int)x1,(int)y1,RGB(0,255,0));

}

}

paintBall(x,y,10,pDC);

}

1.4.4 逐帧动画制作

【例1-30】设计程序播放多幅bmp图像。

然后,把下面代码写入OnDraw函数中,就可以连续播放装入项目的多幅图像。CBitmap b[9];

CDC d[9];

b[0].LoadBitmap(IDB_BITMAP1);

b[1].LoadBitmap(IDB_BITMAP2);

b[2].LoadBitmap(IDB_BITMAP3);

b[3].LoadBitmap(IDB_BITMAP4);

b[4].LoadBitmap(IDB_BITMAP5);

b[5].LoadBitmap(IDB_BITMAP6);

b[6].LoadBitmap(IDB_BITMAP7);

b[7].LoadBitmap(IDB_BITMAP8);

b[8].LoadBitmap(IDB_BITMAP9);

for(int t=0;t<9;t++)

{

d[t].CreateCompatibleDC(pDC);

d[t].SelectObject(&b[t]);

pDC->BitBlt(20,20,600,600,&d[t],1,1,SRCCOPY);

Sleep(100);

}

在这两个事件函数中写入代码(粗体的语句),如下所示:

void CAaaView::OnMouseMove(UINT nFlags, CPoint point)

{

SetTimer(1,10,NULL);

m_Point=point;

CView::OnMouseMove(nFlags, point);

}

void CAaaView::OnTimer(UINT nIDEvent)

{

CAaaDoc* pDoc = GetDocument(); //加入这两个语句为的是调用画图设备

ASSERT_VALID(pDoc); //这两个语句在OnDraw函数中,复制过来即可

CClientDC dc(this);

dc.Ellipse(m_Point.x,m_Point.y,m_Point.x+60,m_Point.y+30);

CView::OnTimer(nIDEvent);

}

最后别忘记在视图文件的前面或者视图头文件aaaView.h中加入下面(全局变量)定义:public:

CPoint m_Point;

1.4.6 移动鼠标进行书写

【例1-32】使用鼠标移动事件绘制图形。

仍然使用CClientDC dc(this);

dc.LineTo(p.x,p.y);

加入代码后,如图1-51所示。

图1-52 移动鼠标绘制原点到当前点的线段图1-53 移动鼠标在当前位置绘制点dc.LineTo(p.x,p.y)中,也使用p.x,p.y来调用其成员。从中可以看出,原先函数参数point只是一个变量名。

【例1-33】设计程序,运行后得到单文档界面,移动鼠标就可以在其上进行书写。

把上面程序段修改为下面所示:

CClientDC dc(this);

dc.MoveTo(p.x,p.y);

dc.SetPixel(p.x,p.y,0);

在T7.cpp文件中找到函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam),在该函数最后,语句return 0;之前加入下面程序段:HDC hDC;

PAINTSTRUCT PtStr;

HPEN hPen;

HBRUSH hBrush;

for(int nStyle=0;nStyle<6;nStyle++)

{

hDC=BeginPaint(hWnd,&PtStr);

hPen=CreatePen(PS_SOLID,5,RGB(0,0,255));

SelectObject(hDC,hPen);

hBrush=CreateHatchBrush(nStyle,RGB(255,0,0));

SelectObject(hDC,hBrush);

Rectangle(hDC,300,200,150,100);

Sleep(500);

InvalidateRect(hWnd,NULL,1);

}

1.5.2 使用颜色渐变制作动画

【例1-35】制作颜色渐变动画。

其他步骤与例1-34相同,只是把加入到函数中的代码变为下面所示:

HDC hDC;

PAINTSTRUCT PtStr;

HPEN hPen;

HBRUSH hBrush;

for(int nColor=0;nColor<256*256;nColor=nColor+1000)

{

hDC=BeginPaint(hWnd,&PtStr);

hPen=CreatePen(PS_SOLID,2,RGB(0,0,255));

SelectObject(hDC,hPen);

hBrush=CreateSolidBrush(nColor);

SelectObject(hDC,hBrush);

RECT rect;

GetClientRect(hWnd,&rect);

int w=(rect.right-rect.left)/5;

int h=(rect.bottom-rect.top)/2;

Ellipse(hDC,w+80,h+100,w-80,h-100);

Sleep(100);

InvalidateRect(hWnd,NULL,1);

}

ReleaseDC(hWnd,hDC);

习题一

一、程序修改题

1 修改例1-4中的程序,首先,把语句pDC->SetPixel(i,j,RGB(i,j,0))改为pDC->SetPixel(i,j,RGB(i,0,0)),观察运行后的效果。

如果把语句pDC->Ellipse(30,20,250,180)放在循环语句的前面,如下所示,观察运行后的效果。

pDC->Ellipse(30,20,250,180);

for(int i=30;i<250;i++)

for(int j=20;j<180;j++)

{

pDC->SetPixel(i,j,RGB(i,j,0));

}

2 修改例1-5程序,逐个显示数字1、2、3、4、5等制作动画。

3 修改例1-9程序,使其能够绘制出一个边长为160的具有真实感的正方体。

4 修改例1-10程序,使得抬起鼠标就可以绘制出一个椭圆。

5 修改例1-12程序,给菜单“H”再添加一个子菜单项“绘制椭圆”,添加事件,写入代码,使得程序运行后,单击该菜单项可以绘制出一个椭圆。

6 把例1-12程序中的语句dc.SetPixel(x*100+120,y*100+150,i)修改为:

dc.SetPixel(x*100+120,z*100+150,i)运行程序,观察绘制结果。

7 修改例1-16程序制作汉字逐个显示动画,输出下面语句:你好!欢迎你来到大连大学,大连老乡会欢迎你!8 修改例1-21程序,在一个程序中读入两个图像,然后显示在一个文档的窗口中。图像如果大,可以分别显示每个图像的一部分。

9 修改例1-22程序,把获取的颜色数据写在一个文本文档中。

10 修改例1-30程序,在播放多幅bmp图像时,使用循环语句以字符串连接方式调用多幅图像。这样当图像多的时候(例如1000个),就可以避免在程序中写入大量的类似IDB_BITMAP1这样的图像名。

11 修改例1-33程序,当按下鼠标拖动时,进行书写,抬起鼠标时,书写结束。

二、程序分析题

1 在单文档项目的OnDraw函数中加入下面语句,就能够绘制出正弦曲线。该曲线如图1-58所示。

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

{

int y=100*sin(float(i)/100);

pDC->SetPixel(i,y+120,0);

}

不过从图形上观察,绘制出的不是()π2,0上的正弦曲线,分析其原因。

1-58 绘制出的正弦曲线

2 下面程序完成什么功能?

CPen myPen;

int i,y;

for(y=i=0;i<5;++i)

{

myPen.CreatePen(i,0,RGB(0,0,225));

pDC->SelectObject(&myPen);

y+=10;

pDC->MoveTo(10,y);

pDC->LineTo(100,y);

myPen.DeleteObject();

}

3 在解决例1-26小球平抛运动中绘制慢的问题时,可以使用圆或者椭圆代替逐点绘制,系统绘制圆的函数速度快。按照这个想法,一个同学给出了下面的程序,该程序是否存在问题?调试运行,观察绘制效果。

void paintBall(int x,int y,int r,CDC *pDC)

{

double w,u,d; int R=0,G=0,B=0;

w=r;d=w/255;

CPen p;

while(w>=0) //循环嵌套,里层循环是绘制一个圆,外层循环是绘制半径不同的圆{

//for(u=0;u<=628;u=u+1) //使用参数方程绘圆

//{ x与y是球心(圆心)位置,u/100约等于

p.CreatePen(1,0,RGB(R,G,B)); //把画笔设为白色,小圆没有(看不到)边界 pDC->SelectObject(&p);

//pDC->SetPixel((int)(x+w*cos(u/100)),(int)(y+(w*sin(u/100))),RGB(R,G,B));

pDC->Ellipse((int)x,(int)y,(int)w,(int)w);

// }

R++;G++;B++; //每次颜色值分量增加,点变亮

w=w-d; //每次半径变小,圆逐渐向里面绘制

}

}

void CMenu001View::OnDraw(CDC* pDC)

{

CMenu001Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

for(int t=1;t<280;t=t+20)

{

int r=20;

int x,y;

x=t;y=0.5*9.8*t*t/1000;

paintBall(x,y,r,pDC);

Sleep(100);

pDC->FillSolidRect(x-r,y-r,2*r,2*r,256*256*256-1);

}

}

4 例1-25要实现小圆从上到下运动,再从下到上弹起动画。该程序运行后,小圆落下弹起,但是只能弹起一次,为什么会出现这种情况?

下面是一个同学修改后的结果,运行该程序,并进行分析比较。

(小球落下,弹起,再落下,弹起,直到停止,效果很好)

void paintBall(int y,CDC* pDC)

{

CBrush b(RGB(255,255,255));

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

{

CPen p;

p.CreatePen(0,2,RGB(255,5+i*10,5+i*10));

pDC->SelectObject(&p);

pDC->Ellipse(100+i,10+i+y,150-i,60-i+y);

}

Sleep(50);

pDC->SelectObject(&b);

pDC->Ellipse(100,10+y,150,60+y);

}

void CSpringBallView::OnDraw(CDC* pDC)

{

CSpringBallDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

int k=1,t=1,r=10,i;

while(t<20)

{

for(i=r;i<300;i=i+k*2)

{

paintBall(i,pDC);

k++;

}

for(r=i;r>=10,k>=1;r=r-k*2)

{

paintBall(r,pDC);

k--;

}

t++;

}

}

5 建立一个项目,选择,观察分析系统自动生成的代码。

三、程序设计题

1 在单文档的OnDraw函数中设计程序,绘制一个具有真实感的球(或者半球),其光线是从正前方照射过来,如图1-59所示。

1-59 一个具有真实感的半球

图1-59是使用下面Matlab程序段绘制出的,供参考。

r=1;

for t=0:0.01:2*pi

for m=0:0.01:2*pi

x=r*cos(m)*cos(t);

y=r*sin(m)*cos(t);

z=r*sin(t);

h1=plot3(x,y,z);

set(h1,'color',[z,z,z]);

end

hold on;

end

lighting none2 使用CDC类的绘制直线段函数LineTo绘制一个等腰直角三角形。

3 建立一个单文档项目,绘制两个小球,一个小球用上、下、左、右键控制其上下左右运动,一个小球用W、Z、A、D键控制其上下左右运动。

4 实际上,显示在计算机屏幕上的文字都是绘制出来的。使用画点函数编写程序,绘制出近似的1、2、3、4、5。(数字占有的像素点数及位置自己拟定,使用画点函数或者画线函数进行绘制)

5 把上面4题中绘制数字的程序改写为函数,然后(在OnDraw函数中)调用。

6 在上面5题中程序的基础上继续改写程序,当按下“2”键时,在单文档窗口中输出(绘制出)2。

气象程序设计及绘图实习报告

实习要求: ?根据所提供的实习说明和资料,按要求完成实习内容; ?将完成的实习内容按步骤写入实习报告中,包括资料说明、Fortran程序、CTL文件、gs文件、绘制的图形(要求在图形上方用draw title的方式添加标题,注明姓名拼音及学号) ?根据所绘图形及查找相关文献,说明本次实习所求物理量场的意义。 实习内容: ?Nino34海温指数与海平面气压相关图 ?Nino34海温指数与中国160站降水相关图 1.绘制1月份Nino34海温指数与1月份海平面气压相关图 1.1 资料说明 ?Nino34指数:Nino34.txt是1951年1月至2013年12月Nino3.4区(热带太平洋:西经170度~西经120度、北纬5度~南纬5度)区域平均海温指数资料,共有63行数据,每行数据第一个数字为年份,后面12个数字为该年1-12月的海温指数; ?全球海平面气压月平均数据:slp.jan.grd为1951至2013年的1月全球海平面气压场二进制数据,年数为63年,格点数144*73,水平分辨率2.5?*2.5?; 1.2步骤: 1用Fortran编写corr.grid.f90文件,计算1951-2013年1月Nino34海温指数与海平面气压相关系数,计算结果保存于corr.slp.grd 文件中; corr.grid.f90文件: program cx implicit none realt(63),p(73,144,63),r(73,144),relation,z(63) character*12 c(63) character*7 a(63) integer i,j,k open(5,file='D:\expriments\grads\slp.jan.grd',fo rm='binary') open(6,file='D:\expriments\grads\nino34.txt') do i=1,63 read(6,'(A12)') c(i) end do do i=1,63 read(c(i),'(A7,F5.2)') a(i),t(i) end do do k=1,63 read(5) ((p(i,j,k),j=1,144),i=1,73) end do !print*,p do i=1,73 do j=1,144 do k=1,63 z(k)=p(i,j,k) end do r(i,j)=relation(z,t,63) end do end do !print*,r open(7,file='D:\expriments\grads\corr.slp.txt') open(8,file='D:\expriments\grads\corr.slp.grd',f orm='binary') write(7,'(144F5.2)') ((r(i,j),j=1,144),i=1,73) write(8) ((r(i,j),j=1,144),i=1,73) end function relation(a,b,n) implicit none integer,intent(in)::n real,intent(in)::a(n),b(n) real::relation !返回的相关系数integer::i,j !循环控制变量 real::sfenzi,sfenmu1,sfenmu2,s !加法器real::amean,bmean !a,b向量的平均值

(画图vc程序设计)

西安科技大学 《VC++程序设计》 实验报告 题目画图 院、系(部)计算机科学与技术学院专业及班级 学号 姓名:szgkb 日期 2014.6.2

1 题目要求 建立一个通过“画图”程序,它是基于MFC的多文档应用程序,并且应用程序的风格样式具有Office视觉样式的Ribbon风格。在实现程序的过程中,要创建具有Office视觉样式的项目,再为应用程序的Ribbon功能区添加相应的绘图命令。在实现绘图中,能够很好地使用CDC类中的绘图函数,以实现直线、矩形、圆弧、椭圆等的绘制。了解MFC中设备环境类和坐标映射方式,并且了解常用的GDI对象。扩展“画图”程序实现图形的绘制、保存、滚动等功能。 2 功能需求 选择“绘图”选项卡后,将会展开一些绘图工具。选择某个绘图工具后,便可以在客户区中绘制相应的图形,还可以点击面板上的“画笔颜色”和“填充颜色”按钮,利用弹出的颜色对话框分别设置绘图的颜色及填充的颜色,而且单击“文本”按钮还可以在客户区中输入文本内容,在文本输入中,涉及到文本的颜色、插入符的位置、字体、退格、回车、文本字符等的正确处理。 3 总体设计 建立一个MFC的基于对话框的应用程序,取名为MyPaint1。接下来创建Ribbon 功能区,创建了“工具”、“颜色”两个面板。新建绘图类CDrawShape用以封装自由线、直线、矩形、椭圆、圆的绘制过程。在CMyPaint1View中响应绘图命令并通过添加鼠标左键按下以及移动的消息响应函数(OnLButtonDown、OnMouseMovehe、 OnLButtonup)来实现图形绘制。另外设置插入符、文本内容、文本颜色,来实现文本的输出。最后进行对绘图光标的修改。 3.1 系统模块 3.2 系统业务处理流程运行“画图”程序“绘图”菜单 工具面板 客户区绘图 颜色面板 保存图形

Java画图板程序设计报告

西安科技大学Java语言课程设计报告 ¥

题目:画图板应用程序开发 & 班级: 学号: 姓名: 2010年 12 月 目录 1 设计题目及具体要求 (3) · 2 总体设计 (6) 3 详细设计与实现 (4) 4 系统测试 (11) 5 设计小结 (31) 参考文献 $

: 1、设计题目及具体要求 题目需求 ? 1. 设计题目:小画图板的开发。 2. 重点分析 本软件的重难点为主窗体的设计、菜单栏和工具栏的设计、事件响应的处理、画图的基本功能的实现。 3. 实现功能

1.新建一个空白图形文件:用于绘制新的图形。 2.打开或保存一个图形文件,便于对图形文件的管理。 3.绘制一些基本的图形组件:直线,矩形,实心矩形,椭圆,实心椭圆,圆,实心圆,圆角矩形,实心圆角矩形等。 4.用鼠标在绘图板上单击拖动进行随笔花。 5.` 6.橡皮擦:可以将已绘制的图形擦掉。 7.添加文字:可以在绘图区域内添加文字。 8.选择文字的字体:通过一个下拉式的选择条,可以选中所需要的字体。本程序中包括:宋体,隶书,华文彩云,仿宋-GB2312,华文行楷,Times New Roman,Serif,Monospaced,SonsSerif,Garamond。当然,在下面的程序分析中可以看到,由于设置了字体选择数组,使得可以随意添加系统支持的任何字体。大大方便和简化了程序设计。 9.选择文字的字体风格:通过两个复选框按钮,可以选择需要的字体风格,包括:粗体,斜体,用同时选中两者,只选择其中一种或两者都不选中3种选择方式。10.设置画笔的颜色:可以选择当前绘制图形的画笔颜色,让图形更加丰富多彩,生动活泼。 10. 设置画笔的粗细:该选项在作用于基本图形组件和文字时,它的效果是不同的。 当作用于绘制图形组建时,它的作用是改变画笔绘制线条的粗细;当作用于文字时,它的作用是改变文字的大小。 ;

简单画图程序设计

面向对象程序设计 课程设计报告 设计题目:简单画图程序的设计 学院:信息工程学院 专业:计算机科学与技术(交通)学号: 姓名: 指导教师: 2015 年1 月4 日

目录 1.设计目的和内容------------------------------------------------1 1.1.设计目的-----------------------------------------------------------1 1.2.设计内容-----------------------------------------------------------1 2.基本功能---------------------------------------------------------1 2.1.图形样式-----------------------------------------------------------1 2.2.颜色样式-----------------------------------------------------------2 2. 3.画笔样式-----------------------------------------------------------2 2.4.线型选择-----------------------------------------------------------3 3.设计思路---------------------------------------------------------3 4.软件设计---------------------------------------------------------5 4.1.设计步骤-----------------------------------------------------------5 4.2.界面设计-----------------------------------------------------------8 4.3.关键功能的实现----------------------------------------------------9

第二讲 Matlab编程与作图

第二讲Matlab编程与作图 第一部分Matlab程序设计初步 Matlab除了指令行操作的直接交互外,作为一种高级应用软件还提供了自己的编程语言。通过编写Matlab程序,可以更加方便地调用Matlab提供的各种功能强大的函数库,使得程序能完成复杂的运算处理大量的数值数据。 1、M文件简介 Matlab提供了丰富的编程语言,使得用户可以将一连串的命令写入文件,然后使用简单的函数来执行这些命令。文件被保存为文本文件,后缀为.m,比如说dblquad.m,因此Matlab的程序通常被称为M 文件。 M文件是一个文本文件,可以使用各种文本编辑器对它进行编辑和修改,比如Windows操作系统自带的记事本,也可以用Matlab 内建的M文件编辑器。 M文件分为两类,一类称为脚本(Scripts),类似于批处理文件,相当于将在Matlab命令窗口中执行的一系列指令放在一个文件中,当在命令窗口调用该文件名时,则按顺序执行其中的命令集。 例:编写求10!的程序。 另一类M文件称为函数(Function),它可以接受输入变量,并将运算结果送至输出变量,类似于数学中的函数y=f(x)。 函数M文件的基本结构: function f=fact(n) 函数定义行

%Compute a factorial value. %FACT(N) returns the factorial of N, 帮助文档%usually denoted by N! %Put simply,FACT(N) is PROD(1:N), 注释 f=prod(1:n); 函数体2、运算符 关系运算符:<, <=, >, >=, = =, ~= 逻辑运算符:与(&),或(|),非(~) 例:编写分段函数 21 () 1 -1<1 321 x x f x x x x ?> ? =≤ ? ?+≤- ? %myfun1.m function y=myfun1(x) y=(x.^2).*(x>1)+(x>-1& x<=1)+(3+2*x).*(x<=-1); 注意:1.函数名与变量名的命名法则相同,要求以字母开头,后接字母或下划线;2.函数名与保存的文件名最好一致。 3、控制流 所有的计算机编程语言都提供了控制程序流执行程序的语法,Matlab也不例外。所有的控制流语法都以end 结尾。 ⑴for 循环语句 语法:for 循环变量=数组 指令组;

面向对象程序设计课程设计——绘图

面向对象程序设计课程设计报告 题目: 专业: 班级: 学号: 姓名: 指导老师: 时间:

一、课程设计题目及所涉及知识点 设计题目是“用菜单和按钮来控制绘图”,实现简单绘图功能,具体要求:画直线,画空心或实心椭圆、画空心或实心矩形、画多边形(图形的位置和大小可在程序中设定)。界面要求:用图形界面实现。所涉及的知识点主要是: 1、java的抽象与封装:private、public、protected之类的访问属性控制符; 2、图形用户界面:java中的awt包(Panel、Frame类),swing包(JFrame、Jpanel类)以及各种组件的使用即按钮JButton、布局管理器(BorderLayout、GridLayout等)、标签JLabel、JTextField等; 3、java机制:鼠标事件的处理,窗口事件的处理; 4、类的继承与接口的实现:类的继承(extends关键字),接口的实现(implements关键字)。 二、课程设计思路 设计思路: 1、设计绘制图形的图形界面是基于AWT 、SWING组;在窗体中加入菜单栏、面板,在面板中加入按钮等组件,这样就构成了图形界面。 2、建立菜单项和按钮的监听事件,使之在点击之后触发绘图函数。 3、利用绘图函数画直线,画空心或实心椭圆、画空心或实心矩形、画多边形图形。 三、课程设计中遇到的难点及解决办法 1、绘图区域用画布不能实现绘图。通过使用面板来解决此类问题,把画布改为面板,用绘图函数把图形绘制好之后加入面板,把面板添加到窗体中。 2、事件处理不正常,如点击按钮之后不能正常绘制函数。通过改变事件的监听状态,把事件监听加入到面板类中使之正常。 四、总结 通过这次的课程程序设计,我学会了如何把自己学习到的基础知识转化为应用程序。不仅仅温习了基础知识、扩大了专业知识面,而且通过书籍、网络对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。通过自己的动手实践,我也发现了自己有很多不足的地方,更加认识到要努力自己解决问题,无论是通过书籍还是网络资料,自己动手实践,这样更能加深印象,加强记忆,促使自己不得不去提高自己的编程水平,本次实验让我认识到实验的重要性,实践比理论更能提高自身的知识。通过这

vc++(vs2010) windows编程与绘图程序设计

1 Vc++2010开发平台概述 (3) 1.1Vc++2010概述 (3) 1.2 Visual Studio 2010 集成开发环境 (3) 1.2.1安装Visual Studio 2010 (3) 1.2.2配置Visual Studio 2010 (3) 1.2.3解决方案和项目 (3) 1.2.4生成和调试工具 (3) 1.2.5部署工具 (3) 1.2.6 Ribbon界面设计可视化 (4) 2 Visual Studio 2010 MFC基本程序设计 (4) 2.1 MFC应用程序概述 (4) 2.1.1简单的MFC应用程序 (4) 2.1.2 MFC应用程序分析 (4) 2.2 MFC应用程序的创建 (4) 2.2.1 用AppWizard创建CLR控制台应用程序 (4) 2.2.2 用AppWizard创建win32控制台应用程序 (4) 2.2.3 用AppWizard创建一个MFC应用程序 (5) 2.3 MFC的类 (9) 2.3.1 MFC应用程序中包含的类 (9) 2.3.2 应用程序类 (10) 2.3.3 主框架类 (10) 2.3.4 视图类 (10) 2.3.5 文档类 (10) 2.3.6 对话框类 (10) 2.3.7 菜单类 (10) 2.3.8 线程基类 (10) 3 Wndows窗体应用程序 (11) 3.1 创建Wndows窗体应用程序 (11) 3.2 窗体属性及设置 (12) 3.3 窗体事件及处理 (13) 3.4 窗体控件添加与编辑 (13) 4 用户界面设计 (13) 4.1 菜单设计 (13) 4.1.1 菜单的类型 (13) 4.1.2 菜单设计 (13) 4.1.3 创建弹出式菜单 (20) 4.1.4 创建动态菜单 (20) 4.1.5 创建基于对话框的菜单 (20) 4.2 工具栏设计 (20) 4.3 状态栏设计 (20) 5 对话框设计 (20) 5.1 静态对话框 (20) 5.1.1静态对话框的建立过程 (20) 5.1.2静态对话框的应用 (21)

画图画板设计模式

长沙学院 课程设计说明书 题目设计模式课程设计系(部) 数学与计算机科学系专业(班级) 姓名 学号 指导教师 起止日期

课程设计任务书 课程名称:设计模式课程设计 设计题目:基于设计模式的绘图程序 已知技术参数和设计要求: 1.问题描述(功能要求): 1.需求分析 该系统是一个画图程序,我们要用设计模式的思想来设计系统结构,然后实现基本图形的绘制功能。 1.1 设计模式要求 至少在其中运用3种模式,其中涉及到的模式有装饰模式、策略模式、桥梁模式三种。 1.2 画图基本要求 能实现基本图形的绘制功能 1.3 画图高级要求 实现图形的操作(如选取、移动、放大、缩小、改变颜色、改变线形等)和持久化(利用文件或利用数据库)。 1.4 参考界面 图1 参考效果图1

图2 参考效果图2 2. 运行环境要求: Windows操作系统; Eclipse 3. 技术要求: 给出至少3种设计模式,要求具体说明使用每种设计模式的动机,画出类图,并代码实现,然后评价该设计模式的优缺点。 设计工作量: 2周 工作计划: (1) 2013级软件工程 4课时:讲授 32课时:上机、调试。计算机系机房 4课时:答辩。计算机系机房。 指导教师签名:日期: 教研室主任签名:日期: 系主任签名:日期:

长沙学院课程设计鉴定表

目录 第1章系统需求 (8) 1.1系统总需求 (8) 1.2功能需求 (8) 第3章系统设计 (9) 3.1系统总功能模块设计 (9) 3.2子功能模块设计 (9) 3.2.1构建基本图形 (9) 3.2.2装饰模式组合图形 (10) 3.2.3桥接模式修饰图形颜色线条粗细 (10) 第4章系统实现 (11) 4.1登陆界面 (11) 4.2简单工厂模式绘制基本图形 (11) 4.2.1装饰模式图形组合 (13) 4.2.2桥接模式改变粗细绘制图形 (14) 第5章系统测试 (15) 5.1测试目的 (15) 5.2测试手段 (15) 5.3测试用例 (15) 5.3.1登陆界面测试 (15) 结论 (16) 参考文献 (17) 结束语 (18) 附录 (19)

基于C++的简单Windows画图程序设计

学校代码 10126 学号 00861003 本科学年论文 题目基于C++的简单Windows画图程序设计 院系内蒙古大学鄂尔多斯学院 专业名称自动化 年级 2008 级 学生姓名宋杰 指导教师金涛 2011年06月20日

学年论文指导教师评阅意见 2

内蒙古大学鄂尔多斯学院2008级自动化专业学年论文 基于C++的简单Windows画图程序设计 摘要 本文简要介绍了基于C++的简单画图程序的实验设计过程。该设计以C++这一高级语言为基础,依托VC++开发环境中的MFC类设计而成,可实现最基本的绘图以及图形的保存与修改等功能。程序开发过程中采用了面向对象技术,易于扩充和维护。通过本次设计对面向对象技术及MFC有更深刻的了解,为今后图形系统的开发及可视化程序的设计提供了一个良好的实践基础。 关键词:VC++,MFC,对象,画图 I

基于C++的简单Windows画图程序设计 00861003 Simple Windows Drawing Program Based On C++ ABSTRACT This article briefly describes the design process for a simple drawing program based on C++.The design based on the C++ language, a high-level language, relying on MFC classes in the VC++ development environment designed, can provide the most basic features such as saving and modifying of the drawing, and graphics.The program using object-oriented technology in the development process, is easy to expand and maintain. Through this design to a more profound understanding of object-oriented technology and MFC for future development and Visual program design of graphic system provides a good basis for practice. KEYWORDS: VC++, MFC, object, drawing II

mfc简单绘图程序设计报告

网络工程091班 路林生 2010年12月30日

一、简单的绘图应用程序 1.1.设计内容 能够利用所学的基本知识,设计一个简单的绘图应用程序,具有以下功能:①具备基本的图形绘制功能:直线、圆、矩形;(必须实现的功能)②编辑功能包括:具有橡皮拉线功能,允许鼠标拖放,能双击选中图形元素,能删除和剪切图形元素,能撤消最近的修改等;(这部分功能选做)③数据保存功能:能够把图形数据保存到文件中必须实现的功能)。 1.2.设计目的 ①了解Windows编程的基础知识,掌握MFC应用程序的基本知识; ②基本掌握面向对象程序设计的基本思路和方法; ③掌握用VC++开发应用程序的的一般步骤和方法; 1.3.设计要求 ①用VC++进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释; 2.详细设计与实现 2.1. 基本思路 单文档,添加三个菜单项,直线、矩形、圆、添加一个变量区分点击相关菜单项,添加三个变量,一个记录起点,一个记录终点,一个记录类型。创建序列化类,保存图形信息。 2.2. 设计步骤及主要代码 //主要函数代码 afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnCancelMode(); afx_msg void OnDrawrectangle(); afx_msg void OnDrawround(); afx_msg void OnDrawline(); //保存起点 void CTestdrawView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptOrigin=point; CView::OnLButtonDown(nFlags, point); } //绘图 void CTestdrawView::OnLButtonUp(UINT nFlags, CPoint point)

相关主题