高级语言实验报告_第1页
高级语言实验报告_第2页
高级语言实验报告_第3页
高级语言实验报告_第4页
高级语言实验报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论