




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象课程作业我做的是画笔程序,首先把作业要求写在开头。作业要求:1、 程序界面参考Microsoft画图程序。2、 能够支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆3、 支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状。4、 支持各种笔形画图时的前景和背景色。5、 支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除。6、 支持打印、打印预览功能,并保持图片所见即所得。支持将所画的内容保存为文件,格式为BMP格式。本设计报告包括以下几部分:一 程序实现的功能二 程序功能的具体实现方法三 程序示例说明四 课程设计的体会五 本程序的不足之处六 本程序参考文献一 程序实现的功能程序所用开发工具: Visual C+ 6.0编程工具。实现功能:能够支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆;支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状;支持各种笔形画图时的前景和背景色;支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除;支持打印、打印预览功能;并保持图片所见即所得;支持将所画的内容保存为文件,格式为BMP格式。另外本程序还支持任意设置画笔的颜色,设置画笔笔画的宽度(粗细),支持当窗口发生重绘时将原来所绘的图形在新窗口中重绘出来。二问题分析按照程序设计实现功能的要求,其中应该有以下几部分,划线的实现部分可以在鼠标单击响应函数中实现,其中有:鼠标左键按下,鼠标左键移动,鼠标左键弹起等;设置颜色部分应该创建一个颜色设置对话框,这可用MFC自带的类来实现,为此我们在菜单中添加一个设置菜单,并且下面添加颜色设置菜单项,并且对此菜单项的添加命令响应函数,在其中创建颜色对话框,并且将我们选择的颜色保存到我们预定义的对象中去;同理笔画宽度和背景色的设置也是如此;其中在背景色的设置中当我们选择某种颜色设置背景色时,程序将会刷新窗口,并且用新的背景色填充视口背景。绘图保存为BMP文件的部分,主要是要了解BMP文件的结构,主要是文件头信息,在保存文件时我们要现将BMP文件头信息保存到文件中,然后才是具体的像素信息(如像素位置,颜色);打印和打印预览要实现所见即所得的话,要求我们转换坐标映射模式,从而实现所见即所得的效果。另外程序还实现了选定区域并进行擦出的功能和任意擦除的功能;当窗口发生重绘时,我们以前所绘制的图形会在新窗口中显示出来,即实现了图形的持续显示功能。本程序中我认为较难的部分是BMP文件的保存部分。各种功能的具体实现见下部分。三程序的具体实现主要分为以下几个部分:1. 绘制任意连线,直线,矩形,椭圆的实现这些功能主要是在响应鼠标单击消息的函数中实现的,其中有鼠标左键按下消息响应函数:OnLButtonDown(),鼠标左键弹起消息响应函数:OnLButtonUp() 和鼠标移动消息响应函数OnMouseMove()。为了区分,我在视类中增加了一个UINT型成员变量m_nDrawType,用来标志所画的图形种类;增加了UINT型成员变m_nlinewidth,用来标志笔画的宽度;用COLORREF型对象m_clr来标志笔画的颜色,另外还有标志绘制图形区域起点和终点的两个CPoint对象。2. 画笔颜色设置在程序菜单中添加了颜色设置菜单项,并在视类中添加响应此菜单项的命令响应函数,其中生成了颜色对话框,其类型是:CColorDialog类型。当我们单击颜色设置菜单项时会弹出颜色设置对话框,我们可以选择我们所喜欢的颜色来进行绘图,并且以后所绘的图形都是我们所选定的颜色,除非再次更改颜色。当我们单击颜色对话框上的确定按钮后,我们所选择颜色将会保存到视类的m_clr对象中。3. 笔画宽度的设置首先在程序菜单中添加笔画宽度菜单项,并在视类中添加响应此菜单项的命令响应函数,其中生成了笔画宽度设置对话框,其类型是:Csetwidthdlg类型(自己创建的类)。当我们单击笔画设置菜单项时会弹出笔画设置对话框,我们可以输入我们所喜欢的宽度来进行绘图,并且以后所绘的图形都是我们所选定的宽度,除非再次更改笔画宽度。当我们单击笔画宽度对话框上的确定按钮后,我们所选择宽度将会保存到视类的m_nlinewidth对象中。4. 背景色的设置和笔画颜色设置类似,过程相同,此处不再赘述。此处主要是选定背景色后要用选定的背景色去填充窗口背景。首先我们要获得视口的大小,然后创建画刷去填充背景。5. 选定区域并擦除首先我们要选定区域,然后根据自己需要选择是否要擦除所选中区域中绘制的图形,为此我们在视类中设置了两个CPoint对象来标志所选中区域的起点和终点。若需要擦除,则单击擦除按钮擦除。6. 图擦的实现图擦的实现主要在OnMouseMove()函数中,在其中我们设定了一个BOOL变量来标识是否在进行擦除操作,若在进行则当鼠标左键点下并移动时将进行擦出操作,效果是将鼠标经过的区域一定宽度绘图擦除。具体实现是绘制了一个小矩形,其大小是6*6的矩形,并且用白色填充矩形区域,所以当我们选择擦除操作,鼠标点下并且移动时会擦除所经过的区域。7. 打印和打印预览要保持所见即所得,主要改变了映射模式,将原来的映射模式由设备坐标改到了逻辑坐标映射模式下,在我们绘制图形后,单击打印预览将会看到保持了所见即所得功能,在我们选择打印预览时,在视口中绘制的图形将会出现在同样的位置和并且大小比例和原来相同。8. 保存为BMP文件代码这是本程序较难的一部分,由于以前毕业设计时写过一些图像处理的基本算法,用C语言读取并写入位图文件,所以对位图文件的格式比较了解。在本程序中,我们首先要获得将要保存的图形的大小,然后根据这些信息写入位图文件的文件头(即标志为位图文件,并且有相关的高度,宽度,颜色和存储方法等信息的数据写入文件中)。具体程序如下所示:void CMydrawView:SaveAsBmp()/ TODO: Add your command handler code hereCClientDCdc(this);CDC memDC;CRectrect;GetClientRect(rect);memDC.CreateCompatibleDC(&dc);CBitmap bm;int Width = rect.Width();int Height = rect.Height();bm.CreateCompatibleBitmap(&dc, Width, Height);CBitmap* pOld = memDC.SelectObject(&bm);memDC.BitBlt(0, 0, Width, Height, &dc, 0, 0, SRCCOPY);memDC.SelectObject(pOld);BITMAP btm;bm.GetBitmap(&btm);DWORD size = btm.bmWidthBytes * btm.bmHeight;LPSTR lpData = (LPSTR)GlobalAllocPtr(GPTR, size);BITMAPFILEHEADER bfh;/BITMAPINFOHEADER bih;bih.biBitCount = btm.bmBitsPixel;bih.biClrImportant = 0;bih.biClrUsed = 0;bih.biCompression = 0;bih.biHeight = btm.bmHeight;bih.biPlanes = 1;bih.biSize = sizeof(BITMAPINFOHEADER);bih.biSizeImage = size;bih.biWidth = btm.bmWidth;bih.biXPelsPerMeter = 0;bih.biYPelsPerMeter = 0;GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);/bm.GetBitmapBits(size,lpData);/此函数在处理5-5-5模式的16位色下会出现颜色混乱bfh.bfReserved1 = bfh.bfReserved2 = 0;bfh.bfType = (WORD)(M 8)|B);bfh.bfSize = 54 + size;bfh.bfOffBits = 54;/CFileDialog dlg(false,_T(BMP),_T(*.bmp),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T(*.bmp|*.bmp|*.*|*.*|); CFileDialog dlg(false,_T(BMP),_T(*.bmp),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,位图文件(*.bmp)|*.bmp|,NULL);if (dlg.DoModal()!= IDOK) return;CString filename = dlg.GetFileName() + .bmp;/if (dlg.DoModal()!=IDOK)/return;CFile bf;CString ss=dlg.GetPathName();if(bf.Open(ss, CFile:modeCreate | CFile:modeWrite)bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER);bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER);bf.WriteHuge(lpData, size);bf.Close();AfxMessageBox(保存成功);GlobalFreePtr(lpData);首先我们要定义一个设备上下文,然后创建兼容设备描述表,并且用MFC提供的函数获得视口(即画图区)的宽度和高度,接下来我们利用MFC自带的类定义了位图文件头对象,并将我们将要保存的位图文件的信息保存到了此对象中,后面利用CFileDialog创建了文件保存对话框dlg,让我们来选择保存的文件名和文件路径,最后进行文件的写入,将保存文件头信息的文件头对象和文件数据信息写入到我们所指定文件中去,文件保存成功时将会弹出信息框提示我们文件保存成功。四 示例说明一下对我所做的程序进行一个简单的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 互联网协议分析试题及答案
- 人际网络对公司战略及风险管理的影响试题及答案
- 企业级应用开发技能测试题及答案
- 逆境中的战略决策与风险管理考量试题及答案
- 校招会计面试题目及答案
- 2025年智能化背景下的风险管理试题及答案
- 2025年财务风险防控试题及答案
- 法学概论的重要性与现实意义试题及答案
- 系统设计中的安全性考虑试题及答案
- 小学教师考试试题及答案
- 2024年浙江省单独考试招生文化课考试数学试卷真题(含答案详解)
- 《智慧农业科技兴农》演讲课件
- 智慧果园生产管理系统-培训
- 三年级数学下册计算题大全(每日一练共18份)
- 2024年高级卫生专业技术资格考试传染性疾病控制(087)(副高级)复习试题及解答
- EDI工程手册中文
- 高二语文九日齐山登高省公开课金奖全国赛课一等奖微课获奖课件
- 2024年四川省成都市中考地理+生物试卷真题(含答案解析)
- 食品工程系畜产品加工技术教案
- 入股合作的协议书(2024版)
- 广东省深圳市南山区2023-2024学年七年级下学期期末英语试题
评论
0/150
提交评论