版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 高级语言程序设计实验报告Technology Chmistry Experiment Report班 级:学 号:学生姓名:指导教师:教 务 处2015年 11 月简单绘图软件的实现实验内容:使用Windows API或MFC设计一个绘图软件,可以实现绘制线段、椭圆、矩形和曲线,线的颜色与宽带、图形是否填充可以由用户选择,可以实现所绘制图形的保存与打开,窗口大小改变后图形不消失。实验步骤:(写出模块划分、函数的调用关系、类的关系、关键代码)本绘图软件是使用Window API来进行编写的,主要分为1、 图形的选择与绘制2、 颜色的选择3、 画笔宽度的选择4、 图形的保存、打开与重绘1 图形的
2、选择与绘制1.1 画图时所需用的结构体 typedef struct POINT ptStart,ptEnd;BOOL bMouseDown;HPEN hPen;HBRUSH hBr;INT PenWidth;COLORREF icolor;BOOL bFill;DRAWSTRUCT,*PDRAWSTRUCT;1.2 画图所用的函数 画椭圆时所用的函数VOID EllipseMouseDown(PDRAWSTRUCT pDs,HWND hWnd,WPARAM wParam,LPARAM lParam)pDs->ptStart.x=GET_X_LPARAM(lParam);pDs->
3、ptStart.y=GET_Y_LPARAM(lParam);pDs->ptEnd.x=pDs->ptStart.x;pDs->ptEnd.y=pDs->ptStart.y;pDs->bMouseDown=TRUE;SetCapture(hWnd);VOID EllipseMouseMove(PDRAWSTRUCT pDs,HWND hWnd,WPARAM wParam,LPARAM lParam)if(pDs->bMouseDown)HDC hdc=GetDC(hWnd);HBRUSH hBrOld;SetROP2(hdc,R2_NOTXORPEN);HP
4、EN hPenOld=(HPEN)SelectObject(hdc,pDs->hPen); if(pDs->bFill) hBrOld=(HBRUSH)SelectObject(hdc,pDs->hBr); else SelectObject(hdc,(HBRUSH)GetStockObject(NULL_BRUSH);Ellipse(hdc,pDs->ptStart.x,pDs->ptStart.y,pDs->ptEnd.x,pDs->ptEnd.y);pDs->ptEnd.x=GET_X_LPARAM(lParam);pDs->ptEn
5、d.y=GET_Y_LPARAM(lParam);Ellipse(hdc,pDs->ptStart.x,pDs->ptStart.y,pDs->ptEnd.x,pDs->ptEnd.y);SelectObject(hdc,hPenOld);if(pDs->bFill)SelectObject(hdc,hBrOld);ReleaseDC(hWnd,hdc);VOID EllipseMouseUp(PDRAWSTRUCT pDs,HWND hWnd,WPARAM wParam,LPARAM lParam)HDC hdc;HBRUSH hBrOld;pDs->bM
6、ouseDown=FALSE;ReleaseCapture();hdc=GetDC(hWnd);SetROP2(hdc,R2_NOTXORPEN);HPEN hPenOld=(HPEN)SelectObject(hdc,pDs->hPen); if(pDs->bFill) hBrOld=(HBRUSH)SelectObject(hdc,pDs->hBr); else SelectObject(hdc,(HBRUSH)GetStockObject(NULL_BRUSH);Ellipse(hdc,pDs->ptStart.x,pDs->ptStart.y,pDs-&g
7、t;ptEnd.x,pDs->ptEnd.y);pDs->ptEnd.x=GET_X_LPARAM(lParam);pDs->ptEnd.y=GET_Y_LPARAM(lParam);SetROP2(hdc,R2_COPYPEN);Ellipse(hdc,pDs->ptStart.x,pDs->ptStart.y,pDs->ptEnd.x,pDs->ptEnd.y);myshape.shape=SHAPECIRCLE;myshape.DrawCircle.rect.left=pDs->ptStart.x;myshape.DrawCircle.re
8、ct.top=pDs->ptStart.y;myshape.DrawCircle.rect.right=pDs->ptEnd.x;myshape.DrawCircle.rect.bottom=pDs->ptEnd.y;myshape.DrawCircle.icolor=pDs->icolor;myshape.DrawCircle.PenWidth=pDs->PenWidth;myshape.DrawCircle.bFill=pDs->bFill;graphicArray.Add(myshape);SelectObject(hdc,hPenOld);if(pD
9、s->bFill)SelectObject(hdc,hBrOld);ReleaseDC(hWnd,hdc);ReleaseDC(hWnd,hdc);注:直线、矩形、曲线的绘制函数由于与椭圆的绘制函数非常相似,以及限于篇幅的原因就不多写了。1.3 图形的选择case IDM_DRAW_ELLIPSE:pMouseDown=EllipseMouseDown;pMouseUp=EllipseMouseUp; pMouseMove=EllipseMouseMove;CheckMenuItem(hMenu,IDM_DRAW_LINE,MF_BYCOMMAND|MF_UNCHECKED);Check
10、MenuItem(hMenu,IDM_DRAW_RECTANGLE,MF_BYCOMMAND|MF_UNCHECKED);CheckMenuItem(hMenu,IDM_DRAW_ELLIPSE,MF_BYCOMMAND|MF_CHECKED);CheckMenuItem(hMenu,IDM_DRAW_CURVE,MF_BYCOMMAND|MF_UNCHECKED);break;本段代码用来实现椭圆这一图形的选择。其他图形的选择方法类似。1.4 图形填充与否case IDM_DRAW_FILL:ds.bFill=!ds.bFill;if(ds.bFill)CheckMenuItem(hMenu
11、,IDM_DRAW_FILL,MF_BYCOMMAND|MF_CHECKED);elseCheckMenuItem(hMenu,IDM_DRAW_FILL,MF_BYCOMMAND|MF_UNCHECKED);break;1.5 图形的绘制case WM_LBUTTONDOWN:pMouseDown(&ds,hWnd,wParam,lParam);break;case WM_MOUSEMOVE:pMouseMove(&ds,hWnd,wParam,lParam);break;case WM_LBUTTONUP:pMouseUp(&ds,hWnd,wParam,lPara
12、m);break;2 颜色的选择case IDM_COLOR_RED:ds.icolor=RGB(255,0,0); ChangeColorWidth(ds,hMenu);break;case IDM_COLOR_GREEN:ds.icolor=RGB(0,255,0); ChangeColorWidth(ds,hMenu);break;case IDM_COLOR_BLUE:ds.icolor=RGB(0,0,255); ChangeColorWidth(ds,hMenu);break;3 画笔宽度的选择3.1 宽度值的接收与传递case WM_COMMAND:if (LOWORD(wPar
13、am) = IDOK | LOWORD(wParam) = IDCANCEL)HWND hEdit=GetDlgItem(hDlg,IDC_EDITWITH);GetWindowText(hEdit,buffer,sizeof(buffer);/int a=_wtoi(buffer);/SendMessage(GetParent(hDlg),WM_CHANGWIDTH,(WPARAM)0,(LPARAM)a);SendMessage(GetParent(hDlg),WM_CHANGWIDTH,(WPARAM)0,(LPARAM)buffer);EndDialog(hDlg, LOWORD(wP
14、aram);return (INT_PTR)TRUE;case WM_CHANGWIDTH:ds.PenWidth=_wtoi(WCHAR *)lParam);/ds.PenWidth=lParam; ChangeColorWidth(ds,hMenu);break;3.2 改变画笔颜色与宽度的函数void ChangeColorWidth(DRAWSTRUCT &ds,HMENU hMenu)DeleteObject(ds.hPen);DeleteObject(ds.hBr);ds.hPen=CreatePen(PS_SOLID,ds.PenWidth,ds.icolor); ds.
15、hBr=CreateSolidBrush(ds.icolor);CheckMenuItem(hMenu,IDM_COLOR_RED,MF_BYCOMMAND|MF_CHECKED); CheckMenuItem(hMenu,IDM_COLOR_GREEN,MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(hMenu, IDM_COLOR_BLUE,MF_BYCOMMAND|MF_UNCHECKED);4 图形的保存、打开与重绘4.1 所需用到的结构体与主要变量struct DRAWLINEPOINT ptStart,ptEnd;INT PenWidth;COL
16、ORREF icolor;typedef structRECT rect;INT PenWidth;COLORREF icolor;BOOL bFill;DRAWRECT,DRAWCIRCLE;enum SHAPESHAPELINE,SHAPERECT,SHAPECIRCLE;typedef structSHAPE shape;unionDRAWLINE DrawLine;DRAWRECT DrawRect;DRAWCIRCLE DrawCircle;DRAWSHAPE;CArray< DRAWSHAPE, DRAWSHAPE&> graphicArray;4.2 图形的保
17、存case IDM_SAVE:CFile file(TEXT("shiyan.shp"),CFile:modeWrite|CFile:modeCreate);CArchive ar(&file,CArchive:store);graphicArray.Serialize(ar);break;4.3 图形的打开case IDM_OPEN:CFile file(TEXT("shiyan.shp"),CFile:modeRead);CArchive ar(&file,CArchive:load);graphicArray.Serialize(a
18、r);SendMessage(hWnd,WM_PAINT,0,0);break;4.4 图形的重绘case WM_PAINT:hdc = BeginPaint(hWnd, &ps);for(int i=0;i<graphicArray.GetSize();i+) myshape=graphicArrayi; Paint(hWnd,myshape); EndPaint(hWnd, &ps);break;4.5 在图形的打开与重绘时所需用到的函数void Paint(HWND hWnd,DRAWSHAPE &myshape)HDC hdc=GetDC(hWnd); H
19、PEN hPen,hPenOld;HBRUSH hBr,hBrOld;switch(myshape.shape)case SHAPELINE:hPen=CreatePen(PS_SOLID,myshape.DrawLine.PenWidth,myshape.DrawLine.icolor);hPenOld=(HPEN)SelectObject(hdc,hPen);MoveToEx(hdc,myshape.DrawLine.ptStart.x,myshape.DrawLine.ptStart.y,NULL); LineTo(hdc,myshape.DrawLine.ptEnd.x,myshape
20、.DrawLine.ptEnd.y);SelectObject(hdc,hPenOld);DeleteObject(hPen);break;case SHAPERECT:hPen=CreatePen(PS_SOLID,myshape.DrawRect.PenWidth,myshape.DrawRect.icolor);hPenOld=(HPEN)SelectObject(hdc,hPen);if(myshape.DrawRect.bFill)hBr=CreateSolidBrush(myshape.DrawRect.icolor); hBrOld=(HBRUSH)SelectObject(hd
21、c,hBr);elsehBr=(HBRUSH)GetStockObject(NULL_BRUSH);hBrOld=(HBRUSH)SelectObject(hdc,hBr);Rectangle(hdc,myshape.DrawRect.rect.left,myshape.DrawRect.rect.top,myshape.DrawRect.rect.right,myshape.DrawRect.rect.bottom);SelectObject(hdc,hPenOld);SelectObject(hdc,hBrOld);DeleteObject(hPen);DeleteObject(hBr);break;case SH
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度电力系统电力物资安全储存与运输合同3篇
- 二零二五年建筑公司内部工程承包合同范本5篇
- 临时服务协议:专项工作期间合作意向书版A版
- 2025年度农家乐乡村旅游服务合同范本3篇
- 2024版有关房屋分配协议书
- 2024租赁期满设备回收合同
- 二零二五年租房合同涉及的环保要求3篇
- 二零二五版出租车行业驾驶员劳动合同执行规范6篇
- 二零二五年能源设施工程设计合同补充协议3篇
- 2024版智能可穿戴设备设计与生产合同
- 安全生产培训资料-20220703152820
- 3-U9C操作培训-MRP基础
- 2024至2030年中国铜制装饰材料行业投资前景及策略咨询研究报告
- 中金公司在线测评真题
- 高中英语新课程标准解读课件
- 2024供应商大会策划方案
- 旅游活动碳排放管理评价指标体系构建及实证研究
- 2024小学语文六年级上册第四单元:大单元整体教学课件
- 12S108-1 倒流防止器选用及安装
- 人教版六年级下册数学期末测试卷附答案【达标题】
- 员工工作状态分析
评论
0/150
提交评论