简易绘图程序 使用API和MFC.docx
- 文档编号:22822394
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:20
- 大小:313.77KB
简易绘图程序 使用API和MFC.docx
《简易绘图程序 使用API和MFC.docx》由会员分享,可在线阅读,更多相关《简易绘图程序 使用API和MFC.docx(20页珍藏版)》请在冰豆网上搜索。
简易绘图程序使用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设计建议画图板》包头师范学校论文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易绘图程序 使用API和MFC 简易 绘图 程序 使用 API MFC