《简易绘图程序 使用API和MFC.docx》由会员分享,可在线阅读,更多相关《简易绘图程序 使用API和MFC.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、XXX大学程序设计实践报告课题名称: 程序设计实践 学生姓名: XXXXXxxxxx 班 级: 2012XXXXX 班内序号: XXX 学 号: XXxx21XXX 日 期: 2014年5月 1 课题概述 1.1课题目标和主要内容本课题了实现一个基于API和MFC的简易绘图软件。此简易绘图软件,满足用户进行绘图时的基本需求,主要功能包括绘制会动的时钟,绘制三角形(API实现),绘制线条(MFC实现)。应具有良好的界面、必要的交互信息和简易的菜单进行操作。在程序的设计与实现中,系统开发平台为Windows7,主要工具为Visual Studio 2012。 1.2系统的主要功能 主要功能与说明:
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 系统详细设
3、计 2.2.1 模块划分图及描述简易绘图程序窗口图形模块自由画笔模块绘图函数模块a) 绘图函数模块:通过各种系统自带的绘图函数,直接调用绘图。设置他们的位置,并添加到菜单项,使点击菜单项则可出现相应图形。Lineto:绘制直线Polyline:绘制折线Arc:绘制圆弧线Polybezir:绘制弯曲线Rectant:绘制矩形Roundrect:绘制圆边矩形Ellips:绘制椭圆Pie:绘制扇形b) 自由绘图模块:按下鼠标左键,初始化起始位置,在选定自由绘图模式的情况下,拖动鼠标的同时,获取鼠标当前位置为终点位置,调用MoveTo和LineTo函数连接两点。连线完成后,将上一条直线的终点作为下一次
4、连线的起始位置。反复进行该操作,直到鼠标左键不再处于按下状态。当连线的频率足够快时,所画出的图形能近似于曲线,就能实现自由绘图。更改画笔线宽、线形:设置一个对话框,分别定义两个成员变量储存用户选择的现款和线形,再用一个整形变量,在每次绘图前,声明一个CPen类型的画笔对象,并用储存的颜色和线宽对该对象进行初始化,随后把该画笔选入设备描述表中。c) 窗口图形模块:通过在资源视图中设置菜单栏,将菜单栏设置成绘图函数、设置、清空(等板块;并默认为自由线画图,分别定关联函数和变量来记录做出的选择。2.2.2 类关系图及描述简易绘图程序CsetDLgCMydrawviewCMydrwAppCmainfr
5、amCaboutDlgCmydrawDoc本程序主要在视图类中进行操作,原有类主要是CDrawView类有更改,其他类都由系统生成,未做很大更改。另外,新定义了一个Csettingdlg类来存储线宽和线形的设置。名称属性备注m_ptOrgin成员变量记录画图起点m_ptEnd成员变量记录画图终点m_color成员变量记录画笔和画刷颜色m_width成员变量记录画笔线宽m_SolidBrush成员变量判断是否选择实心画刷m_pBrush成员变量存储画图时使用的画刷LDown成员变量判断鼠标左键是否按下OnLine( )成员函数绘图函数中选择“直线”选项响应函数OnRectangle( )成员函数
6、绘图函数中选择“矩形”选项响应函数OnEllipse( )成员函数绘图函数中选择“椭圆”选项响应函数Onpie( )成员函数绘图函数中选择“扇形”选项响应函数OnLButtonDown( )成员函数绘图模式中鼠标左键按下响应函数OnLButtonUp( )成员函数鼠标左键弹起响应函数Onquanbuqingkong( )成员函数选择“清除屏幕”选项响应函数OnMouseMove( )成员函数鼠标移动响应函数Onxiantiao ( )成员函数储存选择的线条宽度和线条形状2.2.3程序流程图及描述2.3 关键算法分析 API:函数一:/窗口函数LRESULT CALLBACK WndProc(H
7、WND hwnd, UINT message, WPARAM wParam, LPARAM lParam)static int menuId=0;/静态变量int wmId, wmEvent;HDC hdc;PAINTSTRUCT ps;switch(message)case WM_CREATE: SetTimer(hwnd,1,1000,NULL); break;case WM_TIMER: InvalidateRect(hwnd,NULL,TRUE); break; case WM_COMMAND:/处理菜单消息wmId = LOWORD(wParam);wmEvent = HIWORD(
8、wParam);switch (wmId)case IDM_FIG1:menuId=IDM_FIG1;InvalidateRect(hwnd,NULL,TRUE); break;/实现会动的时钟case IDM_FIG2:menuId=IDM_FIG2;InvalidateRect(hwnd,NULL,TRUE); break; /实现三角形的绘制case IDM_EXIT:DestroyWindow(hwnd);break; /实现退出程序功能break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);if (menuId)cwin.open(hwnd,
9、hdc);switch(menuId)case IDM_FIG1:mclock(); break; case IDM_FIG2: DrawTriangle(hwnd,hdc);break; / 其它绘图程序break; EndPaint(hwnd, &ps); break;case WM_DESTROY:KillTimer(hwnd,1);/销毁计时器PostQuitMessage(0);default:/缺省时采用系统消息缺省处理函数return DefWindowProc(hwnd,message,wParam,lParam);return(0);函数二:会动的时钟void mclock(
10、)Shape *pShape;cwinSetColor(RGB(255,255,255); / 白色,设置表芯点的颜色cwinSetColor(RGB(0,255,255);/ 蓝色,设置表盘圆周颜色c5cwinclkPlate;double x,y,x_s,y_s,x_m,y_m,x_h,y_h;int i;for(i=0;iSetColor(RGB(255,255,255);cwinmPoint;struct tm local;time_t t;/ 获取系统日历时间t=time(NULL); / 将日历时间转化为本地时间localtime_s(&local,&t);x_s=0.89*rad
11、ius*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);/* 画表针*/Point hEnd(x_h,y_h),mEnd(x_m,y_m),sEnd(x_s,y_s
12、);Line hLine(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);/ 黄色cwinhLinemLinesLineorg;函数三:画三角形void DrawTriangle(HWND hwnd,HDC hdc)/ 获得客户区域RECT r;GetClientRect(hwnd, &r);/ 设置映像模式SetMapMode (hdc, MM_ISOTROPIC);/
13、设置窗口坐标范围SetWindowExtEx(hdc, 100, 100, NULL);/ 设置视口坐标范围 SetViewportExtEx(hdc, r.right, r.bottom, NULL);/ 绘制三角形 Point p=Point(10,10),Point(10,19),Point(22,19); MoveToEx( hdc, p0.get_x(), p0.get_y(), NULL);for( int i=0; iAddLine(m_ptOrigin, point);/加入线段到指针数组CClientDC dc(this);CPen pen(m_nLineStyle, m_n
14、LineWidth, RGB(0, 0, 0);dc.SelectObject(&pen);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin = point;函数七:清空函数void CMYdrawView:OnDrawInvalidate()/ TODO: 在此添加命令处理程序代码this-Invalidate();函数八:设置对话框CSettingDlg:CSettingDlg(CWnd* pParent /*=NULL*/): CDialogEx(CSettingDlg:IDD, pParent), m_nLineWidth(0), m_
15、nLineStyle(0)3.程序运行结果分析API:图一:会动的时钟图二 三角形绘制图三 菜单MFC:图四:绘图函数展示图五:自由线画图展示图五:设置功能4.总结 4.1课题的难点和关键点 难点:课题的难点在于使用了对Windows的编程,使用到了大量的类,使用了全新的工具MFC。VC是C+语言,是一种面向对象的编程语言。他于基础语言不同点在于,基础语言是一条路走到底的(中断技术除外),而面向对象是等待你的指令才往下走,是被动的编程语言。关键点:vc+是Windows平台上的C+编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。Win
16、dows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。4.2本课题的评价 本课题很有意思,初次接触式充满了意思。设计以及编写时需要查大量的资料,丰富了我们的知识;编写时极容易遇到困难,增加了我们的耐心;最关键的还是学到了很多有用的关于VC的方法技巧。便于我们在今后的学习中将MFC作为一种基本而优良的工具。 4.3心得体会对于WINDOWS编程很游泳而且有意思,我们要好好学习,在以后的运用中才能熟能生巧。3. 参考文献1Visual C+6.0 XXX2 基于MFC设计建议画图板 包头师范学校论文