简易绘图程序 使用API和MFC.docx

上传人:b****1 文档编号:22822394 上传时间:2023-04-28 格式:DOCX 页数:20 大小:313.77KB
下载 相关 举报
简易绘图程序 使用API和MFC.docx_第1页
第1页 / 共20页
简易绘图程序 使用API和MFC.docx_第2页
第2页 / 共20页
简易绘图程序 使用API和MFC.docx_第3页
第3页 / 共20页
简易绘图程序 使用API和MFC.docx_第4页
第4页 / 共20页
简易绘图程序 使用API和MFC.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

简易绘图程序 使用API和MFC.docx

《简易绘图程序 使用API和MFC.docx》由会员分享,可在线阅读,更多相关《简易绘图程序 使用API和MFC.docx(20页珍藏版)》请在冰豆网上搜索。

简易绘图程序 使用API和MFC.docx

简易绘图程序使用API和MFC

XXX大学

程序设计实践报告

 

课题名称:

程序设计实践

学生姓名:

XXXXXxxxxx

班级:

2012XXXXX

班内序号:

XXX

学号:

XXxx21XXX

日期:

2014年5月

1.课题概述

1.1课题目标和主要内容

本课题了实现一个基于API和MFC的简易绘图软件。

此简易绘图软件,满足用户进行绘图时的基本需求,主要功能包括绘制会动的时钟,绘制三角形(API实现),绘制线条(MFC实现)。

应具有良好的界面、必要的交互信息和简易的菜单进行操作。

在程序的设计与实现中,系统开发平台为Windows7,主要工具为VisualStudio2012。

1.2系统的主要功能

主要功能与说明:

DROW1(API):

1)会动的时钟的绘制:

模拟一个真实的表盘,绘制图形,显示实际的时间。

2)绘制简单的三角形;

MFC:

1)图形的绘制:

a)线形绘图函数:

Lineto:

绘制直线

Polyline:

绘制折线

Arc:

绘制圆弧线

Polybezir:

绘制弯曲线

b)区域绘图函数

Rectant:

绘制矩形

Roundrect:

绘制圆边矩形

Ellips:

绘制椭圆

Pie:

绘制扇形

2)自由绘图:

拖动鼠标可以自由绘制曲线,可以通过一个对话框选择所需线形线宽等。

3)清空功能:

1)全部清空:

可以清空整个屏幕内容。

 

2.系统设计

2.1系统总体框架

API:

MFC:

2.2系统详细设计

 

2.2.1模块划分图及描述

 

 

a)绘图函数模块:

通过各种系统自带的绘图函数,直接调用绘图。

设置他们的位置,并添加到菜单项,使点击菜单项则可出现相应图形。

Lineto:

绘制直线

Polyline:

绘制折线

Arc:

绘制圆弧线

Polybezir:

绘制弯曲线

Rectant:

绘制矩形

Roundrect:

绘制圆边矩形

Ellips:

绘制椭圆

Pie:

绘制扇形

b)自由绘图模块:

按下鼠标左键,初始化起始位置,在选定自由绘图模式的情况下,拖动鼠标的同时,获取鼠标当前位置为终点位置,调用MoveTo和LineTo函数连接两点。

连线完成后,将上一条直线的终点作为下一次连线的起始位置。

反复进行该操作,直到鼠标左键不再处于按下状态。

当连线的频率足够快时,所画出的图形能近似于曲线,就能实现自由绘图。

更改画笔线宽、线形:

设置一个对话框,分别定义两个成员变量储存用户选择的现款和线形,再用一个整形变量,在每次绘图前,声明一个CPen类型的画笔对象,并用储存的颜色和线宽对该对象进行初始化,随后把该画笔选入设备描述表中。

c)窗口图形模块:

通过在资源视图中设置菜单栏,将菜单栏设置成绘图函数、设置、清空(等板块;并默认为自由线画图,分别定关联函数和变量来记录做出的选择。

2.2.2类关系图及描述

 

本程序主要在视图类中进行操作,原有类主要是CDrawView类有更改,其他类都由系统生成,未做很大更改。

另外,新定义了一个Csettingdlg类来存储线宽和线形的设置。

名称

属性

备注

m_ptOrgin

成员变量

记录画图起点

m_ptEnd

成员变量

记录画图终点

m_color

成员变量

记录画笔和画刷颜色

m_width

成员变量

记录画笔线宽

m_SolidBrush

成员变量

判断是否选择实心画刷

m_pBrush

成员变量

存储画图时使用的画刷

LDown

成员变量

判断鼠标左键是否按下

OnLine()

成员函数

绘图函数中选择“直线”选项响应函数

OnRectangle()

成员函数

绘图函数中选择“矩形”选项响应函数

OnEllipse()

成员函数

绘图函数中选择“椭圆”选项响应函数

Onpie()

成员函数

绘图函数中选择“扇形”选项响应函数

OnLButtonDown()

成员函数

绘图模式中鼠标左键按下响应函数

OnLButtonUp()

成员函数

鼠标左键弹起响应函数

Onquanbuqingkong()

成员函数

选择“清除屏幕”选项响应函数

OnMouseMove()

成员函数

鼠标移动响应函数

Onxiantiao()

成员函数

储存选择的线条宽度和线条形状

2.2.3程序流程图及描述

2.3关键算法分析

API:

函数一:

//窗口函数

LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,

WPARAMwParam,LPARAMlParam)

{

staticintmenuId=0;//静态变量

intwmId,wmEvent;

HDChdc;

PAINTSTRUCTps;

switch(message)

{

caseWM_CREATE:

SetTimer(hwnd,1,1000,NULL);break;

caseWM_TIMER:

InvalidateRect(hwnd,NULL,TRUE);break;

caseWM_COMMAND:

//处理菜单消息

wmId=LOWORD(wParam);

wmEvent=HIWORD(wParam);

switch(wmId)

{

caseIDM_FIG1:

menuId=IDM_FIG1;

InvalidateRect(hwnd,NULL,TRUE);break;

//实现会动的时钟

caseIDM_FIG2:

menuId=IDM_FIG2;

InvalidateRect(hwnd,NULL,TRUE);break;

//实现三角形的绘制

caseIDM_EXIT:

DestroyWindow(hwnd);break;

//实现退出程序功能

}

break;

caseWM_PAINT:

hdc=BeginPaint(hwnd,&ps);

if(menuId){

cwin.open(hwnd,hdc);

switch(menuId){

caseIDM_FIG1:

mclock();break;

caseIDM_FIG2:

DrawTriangle(hwnd,hdc);break;//其它绘图程序

break;

}

}

EndPaint(hwnd,&ps);

break;

caseWM_DESTROY:

KillTimer(hwnd,1);//销毁计时器

PostQuitMessage(0);

default:

//缺省时采用系统消息缺省处理函数

returnDefWindowProc(hwnd,message,wParam,lParam);

}

return(0);

}

函数二:

会动的时钟

voidmclock()

{Shape*pShape;

cwin<

/*画表盘*/

intradius=6;

Pointorg(0,0);

pShape=&org;

pShape->SetColor(RGB(255,255,255));//白色,设置表芯点的颜色

cwin<

CircleclkPlate(org,radius);

pShape=&clkPlate;

pShape->SetColor(RGB(0,255,255));//蓝色,设置表盘圆周颜色c5

cwin<

doublex,y,x_s,y_s,x_m,y_m,x_h,y_h;

inti;

for(i=0;i<12;i++)//设置个整点的圆点

{

x=0.9*radius*sin(PI*i/6);

y=0.9*radius*cos(PI*i/6);

PointmPoint(x,y);

pShape=&mPoint;

pShape->SetColor((RGB(255,255,255)));

cwin<

}

structtmlocal;

time_tt;

//获取系统日历时间

t=time(NULL);

//将日历时间转化为本地时间

localtime_s(&local,&t);

x_s=0.89*radius*sin(PI*(local.tm_sec)/30);//秒针

y_s=0.89*radius*cos(PI*(local.tm_sec)/30);

x_m=0.7*radius*sin(PI*(local.tm_min)/30);//分针

y_m=0.7*radius*cos(PI*(local.tm_min)/30);

x_h=0.5*radius*sin(PI*(local.tm_hour)/6);//时针

y_h=0.5*radius*cos(PI*(local.tm_hour)/6);

/*画表针*/

PointhEnd(x_h,y_h),mEnd(x_m,y_m),sEnd(x_s,y_s);

LinehLine(org,hEnd),mLine(org,mEnd),sLine(org,sEnd);

hLine.SetColor((RGB(255,0,0)));//红色

mLine.SetColor((RGB(0,255,0)));//绿色

sLine.SetColor((RGB(255,255,0)));//黄色

cwin<

}

函数三:

画三角形

voidDrawTriangle(HWNDhwnd,HDChdc)

{//获得客户区域

RECTr;

GetClientRect(hwnd,&r);

//设置映像模式

SetMapMode(hdc,MM_ISOTROPIC);

//设置窗口坐标范围

SetWindowExtEx(hdc,100,100,NULL);

//设置视口坐标范围

SetViewportExtEx(hdc,r.right,r.bottom,NULL);

//绘制三角形

Pointp[]={Point(10,10),Point(10,19),Point(22,19)};

MoveToEx(hdc,p[0].get_x(),p[0].get_y(),NULL);

for(inti=0;i<3;i++)

{if(i==2)

{LineTo(hdc,p[0].get_x(),p[0].get_y());

continue;

}

LineTo(hdc,p[i+1].get_x(),p[i+1].get_y());

}

}

MFC:

函数一:

画直线

voidCMYdrawView:

:

OnDrawLineto()

{

//TODO:

在此添加命令处理程序代码

CClientDCdc(this);

dc.MoveTo(300,300);

dc.LineTo(400,400);

}

函数二:

画矩形

voidCMYdrawView:

:

OnDrawRectangle()

{

//TODO:

在此添加命令处理程序代码

CClientDCdc(this);

dc.Rectangle(450,100,650,250);

}

函数三:

画椭圆

voidCMYdrawView:

:

OnDrawEllipse()

{

//TODO:

在此添加命令处理程序代码

CClientDCdc(this);

dc.Ellipse(450,400,650,500);

}

函数四:

OnLButtonDown(UINTnFlags,CPointpoint)

voidCMYdrawView:

:

OnLButtonDown(UINTnFlags,CPointpoint)

{

//TODO:

在此添加消息处理程序代码和/或调用默认值

CView:

:

OnLButtonDown(nFlags,point);

SetCapture();

:

:

SetCursor(m_hCross);

m_ptOrigin=point;

m_bDragging=true;

}

函数五:

OnLButtonUp(UINTnFlags,CPointpoint)

voidCMYdrawView:

:

OnLButtonUp(UINTnFlags,CPointpoint)

{

//TODO:

在此添加消息处理程序代码和/或调用默认值

//CView:

:

OnLButtonUp(nFlags,point);

if(m_bDragging)

{

m_bDragging=false;

ReleaseCapture();

}

函数六:

OnMouseMove(UINTnFlags,CPointpoint)

voidCMYdrawView:

:

OnMouseMove(UINTnFlags,CPointpoint)

{

//TODO:

在此添加消息处理程序代码和/或调用默认值

CView:

:

OnMouseMove(nFlags,point);

if(m_bDragging)

{

CMYdrawDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

pDoc->AddLine(m_ptOrigin,point);//加入线段到指针数组

CClientDCdc(this);

CPenpen(m_nLineStyle,m_nLineWidth,RGB(0,0,0));

dc.SelectObject(&pen);

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

m_ptOrigin=point;

}

}

函数七:

清空函数

voidCMYdrawView:

:

OnDrawInvalidate()

{

//TODO:

在此添加命令处理程序代码

this->Invalidate();

}

函数八:

设置对话框

CSettingDlg:

:

CSettingDlg(CWnd*pParent/*=NULL*/)

:

CDialogEx(CSettingDlg:

:

IDD,pParent)

m_nLineWidth(0)

m_nLineStyle(0)

{

}

3.程序运行结果分析

API:

图一:

会动的时钟

图二三角形绘制

图三菜单

MFC:

图四:

绘图函数展示

图五:

自由线画图展示

图五:

设置功能

4.总结

4.1课题的难点和关键点

难点:

课题的难点在于使用了对Windows的编程,使用到了大量的类,使用了全新的工具MFC。

VC是C++语言,是一种面向对象的编程语言。

他于基础语言不同点在于,基础语言是一条路走到底的(中断技术除外),而面向对象是等待你的指令才往下走,是被动的编程语言。

关键点:

vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。

Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。

4.2本课题的评价

本课题很有意思,初次接触式充满了意思。

设计以及编写时需要查大量的资料,丰富了我们的知识;编写时极容易遇到困难,增加了我们的耐心;最关键的还是学到了很多有用的关于VC的方法技巧。

便于我们在今后的学习中将MFC作为一种基本而优良的工具。

4.3心得体会

对于WINDOWS编程很游泳而且有意思,我们要好好学习,在以后的运用中才能熟能生巧。

3.参考文献

[1]《VisualC++6.0》XXX

[2]《基于MFC设计建议画图板》包头师范学校论文

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1