C++面向对象简易图形编辑器.docx
- 文档编号:2006525
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:32
- 大小:76.18KB
C++面向对象简易图形编辑器.docx
《C++面向对象简易图形编辑器.docx》由会员分享,可在线阅读,更多相关《C++面向对象简易图形编辑器.docx(32页珍藏版)》请在冰点文库上搜索。
山东大学(威海)机电与信息工程学院
2011级
面向对象编程技术实验五实验报告
班 级:
学 号:
姓 名:
时 间:
2013-12-01
目 录
1实验要求 1
A、基本功能要求 1
B、高级要求 1
2实验过程及结果 1
2.1交互式绘制图形 1
2.2绘制直线 1
2.3绘制矩形 2
2.4绘制椭圆 3
2.5输入文本 4
2.6文本保存 6
2.7文本读取 7
3实验总结 8
附录关键代码 8
一、主CPP 8
二、附CPP 22
三、头文件 28
面向对象编程技术实验报告
1实验要求
A、基本功能要求
1.交互式绘制图形(至少包括线、矩形和文本),绘制完成的图形能够正确地重现
2.绘制结果可以正确持久化(存储到文件、从文件中读出)//
3.最终交付的工程中至少包含两个源文件(.cpp文件,即除主程序外,将部分函数分离到单独的源文件)、一个rc文件
用“椭圆”绘制
B、高级要求
1.线、矩形、文本的颜色(线色和填充色)、文本字体可调。
2.能够通过鼠标点击选中图形,并进行属性的修改,修改的内容可包括:
l位置
l大小
l颜色
l线型
l字体(对应文本图元而言)
3.能够删除选中的图形
2实验过程及结果
2.1交互式绘制图形
此次绘制图形的程序和例程中EasyDraw不同,相比后者,本程序的绘制是建立在结构体数组的基础上的。
绘制结果完全可以满足实验要求。
效果图如下:
2.2绘制直线
首先定义一个直线的结构体数组
0
面向对象编程技术实验报告
structMySaveLine //直线保存
{
POINTptS;
POINTptE;
COLORREFcolor;intpenWidth;
intpenStyle;
};
绘制直线的函数如下:
voidDrawMyLine(HDChdc) //绘制直线
{
HPENhPen;HPENhPenOld;intj;
for(j=0;j { hPen=CreatePen(SaveLine[j].penStyle,SaveLine[j].penWidth,SaveLine[j].color);hPenOld=(HPEN)SelectObject(hdc,hPen); MoveToEx(hdc,SaveLine[j].ptS.x,SaveLine[j].ptS.y,NULL);LineTo(hdc,SaveLine[j].ptE.x,SaveLine[j].ptE.y);SelectObject(hdc,hPenOld); DeleteObject(hPen); } } 2.3绘制矩形 首先定义一个矩形的结构体数组 structMySaveRectangle //矩形保存 { POINTptS; POINTptE; COLORREFcolor;HBRUSHhNewBrush;intbrushColor; intpenWidth;intpenStyle; }; 绘制矩形的函数如下: voidDrawMyRectangle(HDChdc) //绘制矩形 { intj; HBRUSHhOldBrush;HPENhPen; 2 HPENhPenOld;for(j=0;j { hPen = CreatePen(SaveRectangle[j].penStyle, SaveRectangle[j].penWidth,SaveRectangle[j].color); hPenOld=(HPEN)SelectObject(hdc,hPen);switch(pDrawData->iSelectionBrush) { caseIDM_BRUSH_WHITE: caseIDM_BRUSH_LTGRAY: hOldBrush = (HBRUSH)SelectObject (hdc,GetStockObject(SaveRectangle[j].brushColor)); break; caseIDM_BRUSH_COLORSOLID: caseIDM_BRUSH_CROSS: hOldBrush=(HBRUSH)SelectObject(hdc,SaveRectangle[j].hNewBrush);break; } Rectangle(hdc,SaveRectangle[j].ptS.x,SaveRectangle[j].ptS.y,SaveRectangle[j].ptE.x,SaveRectangle[j].ptE.y); SelectObject(hdc,hPenOld);DeleteObject(hPen);SelectObject(hdc,hOldBrush); } } 2.4绘制椭圆 首先定义一个椭圆的结构体数组 structMySaveEllipse //椭圆保存 { POINTptS; POINTptE; COLORREFcolor;HBRUSHhNewBrush;intbrushColor; intpenWidth;intpenStyle; }; 绘制椭圆的函数如下: voidDrawMyEllipse(HDChdc) //绘制椭圆 HPENhPenOld;for(j=0;j { hPen = CreatePen(SaveEllipse[j].penStyle, SaveEllipse[j].penWidth,SaveEllipse[j].color); hPenOld=(HPEN)SelectObject(hdc,hPen);switch(pDrawData->iSelectionBrush) { caseIDM_BRUSH_WHITE: caseIDM_BRUSH_LTGRAY: hOldBrush = (HBRUSH)SelectObject (hdc,GetStockObject(SaveEllipse[j].brushColor)); break; caseIDM_BRUSH_COLORSOLID: caseIDM_BRUSH_CROSS: hOldBrush=(HBRUSH)SelectObject(hdc,SaveEllipse[j].hNewBrush);break; } Ellipse(hdc,SaveEllipse[j].ptS.x,SaveEllipse[j].ptS.y, SaveEllipse[j].ptE.x,SaveEllipse[j].ptE.y);SelectObject(hdc,hPenOld); DeleteObject(hPen);SelectObject(hdc,hOldBrush); } } 2.5输入文本 输入文本前可以选择文本的字体、颜色,然后点击鼠标左键在该处输入文本。 先定义一个文本的结构体数组 structMySaveText //文本保存 { POINTpt; charg_EditInput[1024];COLORREF crText;HFONThFont; }; 选择字体的函数如下: voidChooseFont(HWNDhwnd) { staticLOGFONT logfont;staticCHOOSEFONT cf;staticHFONT hFont; GetObject(GetStockObject(SYSTEM_FONT),sizeof(LOGFONT), 29 (PTSTR)&logfont); //初始化结构logfont cf.lStructSize =sizeof(CHOOSEFONT);cf.hwndOwner =hwnd; cf.hDC =NULL; cf.lpLogFont =&logfont; cf.iPointSize =0; cf.Flags =CF_INITTOLOGFONTSTRUCT|CF_SCREENFONTS|CF_EFFECTS; cf.rgbColors =0; cf.lCustData =0; cf.lpfnHook =NULL;cf.lpTemplateName=NULL;cf.hInstance =NULL; cf.lpszStyle =NULL; cf.nFontType =0; cf.nSizeMin =0; cf.nSizeMax =0;if(ChooseFont(&cf)) { if(SaveText[q].hFont) DeleteObject(SaveText[q].hFont);SaveText[q].hFont=CreateFontIndirect(&logfont); InvalidateRect(hwnd,NULL,TRUE); } } 选择颜色的函数如下: voidChooseColor(HWNDhwnd) { staticCHOOSECOLOR cc; staticCOLORREF crCustomColors[16];staticCOLORREF crText=RGB(0,0,0); //初始化结构cc cc.lStructSize =sizeof(CHOOSECOLOR);cc.hwndOwner =hwnd; cc.hInstance =NULL; cc.rgbResult =RGB(0,0,0);cc.lpCustColors =crCustomColors; cc.Flags =CC_RGBINIT|CC_FULLOPEN; cc.lCustData =0; cc.lpfnHook =NULL;cc.lpTemplateName=NULL; if(ChooseColor(&cc)) { SaveText[q].crText=crCustomColors[0];InvalidateRect(hwnd,NULL,TRUE); } } 输出函数的文本如下: voidDrawMyText(HDChdc) { intj; for(j=0;j { if(SaveText[j].hFont)SelectObject(hdc,SaveText[j].hFont);//选用逻辑字体SetTextColor(hdc,SaveText[j].crText); TextOut (hdc, SaveText[j].pt.x,SaveText[j].pt.y,SaveText[j].g_EditInput strlen(SaveText[j].g_EditInput)); SelectObject(hdc,GetStockObject(SYSTEM_FONT)); //还原逻辑字体 } }. 2.6文本保存 代码如下 voidSaveMyData(structMySaveLine*SaveLine,intLineCount,structMySaveRectangle*SaveRectangle,intRectangleCount,structMySaveEllipse*SaveEllipse,intEllipseCount,structMySaveText*SaveText,intTextCount) { staticHANDLE hFile; hFile=CreateFile("e: \\abc.f",GENERIC_WRITE,0, NULL,CREATE_ALWAYS,0,NULL);if(hFile! =INVALID_HANDLE_VALUE) { DWORDdwByte1=0;DWORDdwByte2=0;DWORDdwByte3=0;DWORDdwByte4=0; WriteFile(hFile,&LineCount,sizeof(int), &dwByte1,NULL);WriteFile(hFile,&RectangleCount,sizeof(int), &dwByte2,NULL);WriteFile(hFile,&EllipseCount,sizeof(int), &dwByte3,NULL);WriteFile(hFile,&TextCount,sizeof(int), &dwByte4,NULL); WriteFile(hFile,SaveLine,LineCount*sizeof(MySaveLine), &dwByte1,NULL); WriteFile(hFile,SaveRectangle,RectangleCount*sizeof(MySaveRectangle), &dwByte2,NULL); WriteFile(hFile,SaveEllipse,EllipseCount*sizeof(MySaveEllipse), &dwByte3,NULL);WriteFile(hFile,SaveText,TextCount*sizeof(MySaveText), &dwByte4,NULL); CloseHandle(hFile); } } 2.7文本读取 代码如下: voidLoadMyData(structMySaveLine*SaveLine,intLineCount,structMySaveRectangle*SaveRectangle,intRectangleCount,structMySaveEllipse*SaveEllipse,intEllipseCount,structMySaveText*SaveText,intTextCount) { staticHANDLE hFile; hFile=CreateFile("e: \\abc.f",GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,0,NULL);if(hFile! =INVALID_HANDLE_VALUE) { DWORDdwByte1=0;DWORDdwByte2=0;DWORDdwByte3=0;DWORDdwByte4=0; ReadFile(hFile,&LineCount,sizeof(int), &dwByte1,NULL);ReadFile(hFile,&RectangleCount,sizeof(int), &dwByte2,NULL);ReadFile(hFile,&EllipseCount,sizeof(int), &dwByte3,NULL);ReadFile(hFile,&TextCount,sizeof(int), &dwByte4,NULL); ReadFile(hFile,SaveLine,LineCount*sizeof(MySaveLine), &dwByte1,NULL); ReadFile(hFile,SaveRectangle,RectangleCount*sizeof(MySaveRectangle), &dwByte2,NULL); ReadFile(hFile,SaveEllipse,EllipseCount*sizeof(MySaveEllipse), &dwByte3,NULL);ReadFile(hFile,SaveText,TextCount*sizeof(MySaveText), &dwByte4,NULL); CloseHandle(hFile); } } 3实验总结 本实验最大的特点是使用结构体数组,这也是我第一次使用结构体数组,从不使用结构体到使用结构体指针最后升级到结构体数组是一个循序渐进的过程,在这个过程中我越来越感觉到结构体在管理数据方面的优势。 我的感觉是在主CPP文件中代码应该是越少越好,很多地方只要调用函数就可以了,然后在另外的CPP中写函数。 这样的程序给人的感觉是分层做的比较好,调理比较清晰。 附录关键代码 一、主CPP /******************************************************************* 程序: Paint 文件: Paint.cpp 功能: 简易的图像编辑器 ********************************************************************/#include"draw.h" #defineMAX100TCHARszAppName[]; structMySaveLineSaveLine[MAX]; structMySaveRectangleSaveRectangle[MAX];structMySaveEllipseSaveEllipse[MAX];structMySaveTextSaveText[MAX]; intlineCount; intrectangleCount;intellipseCount;inttextCount; DRAWDATA* pDrawData;HACCELhAccel; HDC hdc;inti,m,n,p,q; BOOLInitWindow(HINSTANCEhInstance,intnCmdShow); LRESULTCALLBACKWinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam); /******************************************************************* 函数: WinMain() 功能: Win32应用程序入口函数。 创建主窗口,处理消息循环 ********************************************************************/intWINAPIWinMain(HINSTANCEhInstance, //当前实例句柄 HINSTANCEhPrevInstance, //前一个实例句柄 PSTRszCmdLine, //命令行字符 intiCmdShow) //窗口显示方式 { MSGmsg;char*p; //创建主窗口 if(! InitWindow(hInstance,iCmdShow))returnFALSE; p=0; //进入消息循环: 从该应用程序的消息队列中检取消息, //送到消息处理过程,当检取到WM_QUIT消息时,退出消息循环。 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg);DispatchMessage(&msg); } returnmsg.wParam; } /****************************************************************** 函数: InitWindow() 功能: 创建窗口。 *******************************************************************/staticBOOLInitWindow(HINSTANCEhInstance,intiCmdShow) { HWNDhwnd; //窗口句柄 WNDCLASSwcMainWnd; //窗口类结构ATOMa; //填充窗口类结构 wcMainWnd.style=CS_VREDRAW|CS_HREDRAW;wcMainWnd.lpfnWndProc=WinProc;wcMainWnd.cbClsExtra=0; wcMainWnd.cbWndExtra=0;wcMainWnd.hInstance=hInstance; wcMainWnd.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));wcMainWnd.hCursor=LoadCursor(NULL,IDC_ARROW);wcMainWnd.hbrBackground=(structHBRUSH *)GetStockObject(WHITE_BRUSH);wcMainWnd.lpszMenuName=(LPSTR)IDR_MENU1;; wcMainWnd.lpszClassName=szAppName;LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1)); hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1)); //注册窗口类 a=RegisterClass(&wcMainWnd); if(! a) { MessageBox(NULL,TEXT("注册窗口类失败! "),szAppName,MB_ICONERROR); return0; } //创建主窗口 hwnd=CreateWindow(szAppName, //窗口类名称 TEXT("简易的图形编辑器作者: 娄通"), //窗口标题WS_OVERLAPPEDWINDOW, //窗口风格 200, //窗口位置的x坐标 200, //窗口位置的y坐标 800, //窗口的宽度 450, //窗口的高度 NULL, //父窗口句柄 NULL, //菜单句柄 hInstance, //应用程序实例句柄 NULL); //窗口创建数据指针 if(! hwnd)returnFALSE; //显示并更新窗口 ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd);returnTRUE; } /****************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 面向 对象 简易 图形 编辑器