版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
论文基于VC的图像处理系统设计与实现PAGE62PAGE1毕业设计(论文)基于VC++的图像处理系统设计与实现VC++basedImageProcessingSystemDesignandImplementation班级计/商061学生姓名学号指导教师职称导师单位徐州工业职业技术学院信息系论文提交日期 一.选题意义及背景:图像处理技术一直是困扰VisualC++初学者的一个难题,在VisualC++中,没有一个完善的控件能够显示和处理各种格式的图像,有时用户需要了解各种图像的文件格式,这极大的增加了初学者的学习难度。基于此,设计了一个图像处理软件,本课题属于小型的图像处理软件,主要用于实现图像的显示与批量转换操作。通过分析系统的工作过程,将其用VisualC++程序实现,将理论学习与实例相结合,来培养学生的综合能力。二.毕业设计(论文)主要内容:主要工作:负责程序各个功能的整合、调试及运行三.计划进度:阶段工作程序和要求完成时间前期准备阶段学习毕业设计管理规定并准备与测试有关的资料09.10.19中期指导检查阶段1.需求分析阶段及建立软件及硬件环境条件。分析设计任务书的要求和用户需求,进行可行性分析和需求分析,确定系统所需的模版,安装建立设计所需软硬件环境;素材采集,处理09.10.20-09.10.302.在确定的模版上,对系统功能进行分工,进行相关程序设计,根据用户的使用反馈结果修正自己的设计方案,在解决了大部分的bug后,可以将系统进行打包。09.11.02-09.11.043.进行软件的性能测试,09.11.04-09.11.064.编写测试脚本,并对测试结果进行分析a.编写测试脚本b.对测试结果进行分析09.11.09-09.11.13后期答辩总结阶段1.编写毕业论文a.学习书写毕业论文规范b.查找与所要写的论文有关资料c.根据论文书写规范编写论文d.给指导老师审查并修改09.11.16-09.11.262.交毕业设计09.11.273.准备答辩09.11.27四.毕业设计(论文)结束应提交的材料:1、测试计划2、测试脚本3、测试报告4、毕业论文指导教师教研室主任年月日 年月日论文真实性承诺及指导教师声明学生论文真实性承诺本人郑重声明:所提交的作品是本人在指导教师的指导下,独立进行研究工作所取得的成果,内容真实可靠,不存在抄袭、造假等学术不端行为。除文中已经注明引用的内容外,本论文不含其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。如被发现论文中存在抄袭、造假等学术不端行为,本人愿承担本声明的法律责任和一切后果。毕业生签名: 日期:指导教师关于学生论文真实性审核的声明本人郑重声明:已经对学生论文所涉及的内容进行严格审核,确定其内容均由学生在本人指导下取得,对他人论文及成果的引用已经明确注明,不存在抄袭等学术不端行为。指导教师签名: 日期: 摘要本文对图形图像处理系统的发展现状和所采用的主要技术进行了详细分析,确定了相应的结构和主要功能,以及实际开发中所采取的技术。系统在WindowsXP平台下实现,本课题是采用VisualC++作为编程工具,采用面向对象的程序设计技术实现一个图形绘制和图像处理的应用软件。主要工作分为三类,包括基本图形绘制与编辑、简单的图像处理、图像格式的转换。图形方面主要是设计图形基类,以及继承图形基类的具体图形类。通过对独立功能的封装,可以为今后需要的图形图像的应用奠定基础。系统的优点有:充分体现了面向对象的设计思想,充分运用了C++的特性。程序结构清晰,可读性好,程序中做了充分的注释。最后,对系统进行测试表明,系统功能达到了预期的要求,界面友好,操作简便,运行也较稳定,是一个完成基本功能的图形图像系统。总体上,本文介绍了系统开发设计的全过程和设计过程中部分代码,对系统中采用的关键技术也作了一些必要的说明,对图像变换的基本原理,图像处理的基本原理和各种图像格式做了详细的阐述。关键词:图像处理系统,图像显示,图片格式转换。AbstractThisarticlehascarriedonthedetailedanalysisaboutgraphimageprocessingsystemdevelopmentandusingofthekeytechnology,identifythecorrespondingstructureandcentralfunction,aswellasthesystemadoptstechnologyintheactualdevelopment.ThesystemrealizesundertheWindowsXPplatform,thetopicuseVisualC++asaprogrammingtool,useobject-orientedprogrammingtechniquestoachieveagraphicandimageprocessingsoftware.Majorworkisdividedintothreecategories,basicdrawingandeditinggraphics,simpleimageprocessing,andimageformatconversion.Thegraphaspectisdesignsthegraphbaseclass,aswellasinheritsthegraphbaseclass’sspecificgraphclass.Throughindependentfunction'sencapsulation,forthefuture’sneedsofthegraphicimageslaysthefoundation.Thesystemmerithas:theobject-orienteddesign’sthoughtapplicationofthec++properties,Program’sstructureisclear,goodreadability,codeshasthefullannotationintheprogram.Easyexpansionandtransplantation.Finally,system’stestingshows,system’sfunctionsachievetheexpecteddemand,friendlyinterface,andtheoperationissimple,alsoamuchstableoperation,ithasbasicfunctionsofthegraphicimagesystem.Asawhole,thispaperdescribesthesystemdesignprocessandpartoftheprocessofdesigningcode,itmadesomenecessaryexplanationsaboutkeytechnologyinthesystem,itmadethedetaileddescriptiontoimagetransformofthebasicprinciple,theimageprocessingbasicprincipleandvariousimageformats.Keyword:Theimageryprocessingsystem,imagedisplay,imagetransforms.目录摘要 IAbstract II第一章图像处理系统 11.1概述 11.2系统分析 11.2.1需求分析 11.2.2可行性分析 11.3总体设计 11.3.1项目规划 11.3.2系统功能架构图 21.4系统设计 31.4.1设计目标 31.4.2开发及运行环境 31.5技术准备 31.5.1基本绘图操作 31.5.2内存画布的设计 31.5.3自定义全局函数 41.5.4自定义菜单 51.5.5自定义工具栏 111.6主要功能模块的设计 121.6.1系统架构设计 121.6.2公共模块设计 141.6.3主窗体设计 14参考文献: 18致谢 19第一章图像处理系统1.1概述图像处理技术一直是困扰VisualC++初学者的一个难题,在VisualC++中,没有一个完善的控件能够显示和处理各种格式的图像,有时用户需要了解各种图像的文件格式,这极大地增加了初学者的学习难度。基于此,设计一个图像处理软件。1.2系统分析1.2.1需求分析通过调查,要求系统具有以下功能。显示BMP、JPEG 、GIF等各种格式的图像。实现BMP与JPEG、GIF图像的批量转换。实现对位图的旋转、反色、灰度化、线性变换等各种操作。实现手写数字的识别。1.2.2可行性分析为了降低程序开发的难度,使用微软公司的GDI+。GDI+又称为GDIPlus,是微软公司.NET构架的一部分,它封装了各种图像的处理技术。通过使用GDI,用户可以非常方便地实现图像的显示与转换。虽然GDI+属于.NET框架的一部分,但是用户可以在非.NET环境下使用GDI+,有关具体的使用方法,在以下部分进行介绍。1.3总体设计1.3.1项目规划图像处理系统是一个典型的图像处理软件,它由图像显示、图像转换、图像处理、字符识别、其他和帮助等模块组成。图像显示模块该模块主要包括显示位图、显示JPEG、显示GIF3个部分。图像转换模式该模块主要包括位图转换为JPEG、JPEG转换为位图、位图转换为GIF、GIF转换为位图4个部分。图像处理模块该模块主要包括图像旋转、图像锐化处理、图像反色处理、灰度化处理、线性变换5个部分。字符识别模块该模块主要包括手写数字识别。其他模块该模块主要包括设置菜单的固定颜色和随机颜色两个部分。帮助模块该模块主要包括软件的版本、开发单位等信息。1.3.2系统功能架构图图像处理系统图像显示模块图像处理系统图像显示模块图像转换模块图像处理模块字符识别模块帮助固定颜色随机颜色关于显示JPEG显示GIF显示位图JPEG转换位图位图转换GIFGIF转换位图图像旋转图像锐化处理图像反色处理灰度化处理线性变换手写数字识别其他图1.1图像处理系统功能架构图1.4系统设计1.4.1设计目标本系统属于小型的图像处理软件,主要用于实现图像的显示与批量转换操作。具体设计要求如下。实现各种图像格式的显示。系统采用良好的人机对话模式,界面设计美观、友好。支持图像的单一转换与批量转换。实现位图的各种常规操作。例如图像旋转、灰度化处理、线性变换等。系统运行稳定、安全可靠。1.4.2开发及运行环境系统开发平台:VisualC++6.0。运行平台:WindowsXP/Windows2000/Windows2003。分辨率:最佳效果1024*1280像素。1.5技术准备1.5.1基本绘图操作绘图操作通常是指在窗口的某个区域输出位图图像。窗口通常关联一个设备上下文CDC,所有的绘图操作都是通过CDC来完成的。用户可以通过调用窗口类的GetDC方法获得一个CDC对象指针。CDC提供BitBlt、StretchBlt等方法来输出位图,但是这些方法均需要借助另一个CDC对象来实现。如何设置源设备上下文,并调用BitBit方法输出位图。CDC*Pdc=GetDC();//获取窗口设备的上下文CBitmapbk;//定义位图对象CDCmemdc;//定义设备上下文memdc.CreateCompatibleDC(pDC);//创建一个兼容的设备上下文bk.LoadBitmap(IDB_CHESSBOARD);//加载位图对象memdc.SelectObject(&bk);//选中位图pDC->BitBlt(0,600,600,&memdc,0,0,SRCCOPY);//调用BitBlt方法输出位图1.5.2内存画布的设计在绘制图像时,如果频繁的进行多次绘图操作,会出现闪烁的情况。为了防止闪烁的出现,可以设计一个临时的画布,称之为内存画布,让所有的绘图操作均在内存画布上进行,然后在内存画布对象失去作用域时将其输出到目标设备上下文中,这样就阻止了闪烁情况的出现,内存画布的设计代码如下:m_pbmp->CreateCompatibleBitmap(Pdc,rect.Width(),rect,Height());m_poldbmp=SelectObject(m_bmp);//选中位图对象m_Pdc=PdC;//设置成员变量m_Rect=rect;//设置成员变量//将目标区域绘制在内存画布上this->BitBlt(m_Rect.left,m_Rect.top,m_Rect.Width(),m_Rect.Height(),Pdc,m_Rect.left,m_Rect.top,SRCCOPPY);SelectObject(m_poldbmp);//选中之前选中的对象If(m_pbmp!=NULL)//判断位图对象是否为空deletem_pbmp;//释放位图对象DelectObject(this);//释放设备上下文内存画布CMemDC只包含一个构造函数和析构函数,其中,在构造函数部分,将根据参数pDC创建一个兼容的设备上下文,并且将pDC的内容绘制在内存画布上;在析构函数中,会将内存画布的内容输出到目标设备的上下文中。1.5.3自定义全局函数在VisualC++中没有提供直接的函数用于获取文件的名称(去除扩展名)和获取文件的扩展名(去除文件名)。为此,定义了两个全局函数来获取文件的名称和文件扩展名。函数定义如下:CStringExtractFileName(CString&str)//获取文件名称{intpos=str.ReverseFind(‘.’)}//反向查找“.”的位置returnstr.Left(pos);//从左方开始截取字符串,并返回截取的字符串}CStringGetFileExtendedName(CString&strFile)//获取文件扩展名{intpos=strFile.ReverseFind(‘.’);//反向查找“.”的位置returnstrFile.Right(strFile.GetLength()-pos-1)}菜单栏高度在为本系统设计自定义菜单时,由于主界面对话框的宽度可以调整,导致菜单栏的高度会发生变化,如图1.2所示。菜单栏高度图1.2菜单栏高度从1.2中可以发现,当对话框的宽度变化时,菜单栏的高度也会发生变化,这在绘制菜单的背景颜色时候会带来困难,需要从user32.dll动态链接库中导出该函数。流程图如下:hModule址void*pVoid=(void*)GetProcAddress(hModule,"GetMenuBarInfo");pVoidhModule址void*pVoid=(void*)GetProcAddress(hModule,"GetMenuBarInfo");pVoid数((FunGetMenuInfo)pVoid)(hwnd,idObject,::FreeLibrary(hModule);资源::FreeLibrary(hModule);资源NYNYHMODULEhModule=::LoadLibrary("user32.dll");1.5.4自定义菜单为了使程序界面更加美观,在本系统中自定义了一个菜单,实现菜单的特殊效果显示,如图1.3所示:图1.3自定义菜单在VisualC++中,实现自定义菜单是比较容易的,MFC类库提供了CMenu类用于设计菜单,用户只要从该类派生一个子类,然后改写MeasureItem方法,设置菜单项的高度和宽度;改写DrawItem方法,根据菜单项的不同状态,绘制不同效果的菜单项就可以了。具体设计如下:从CMenu类派生一个子类CCustomMenu。定义一个菜单项结构CMenuItem,记录菜单项的信息。代码如下://定义一个结构,记录菜单项的详细信息StructCMenuItem{CStringm_Menutext;//菜单项的文本UINTm_ImageIndex;//菜单项图像索引Intm_MenuType;//菜单项的类型-2:顶层菜单,-1:弹出式菜单,0:分隔条,其他:普通菜单向CCustomMenu类中添加成员变量。在CCustomMenu类的构造函数中初始化成员变量。CCustomMenu::CCustomMenu(){ m_ItemCount=0;//初始化菜单项数量 m_Index=0;//初始化整型变量 m_MenuList=NULL;//初始化菜单列表 m_BkColor=RGB(204,199,186);//初始化背景颜色 m_SelTopColor=RGB(193,210,238);//初始化顶层菜单颜色 m_RandColor=FALSE;//是否采用随机颜色}在CCustomMenu类的析构函数中释放成员变量占据的堆空间。CCustomMenu::~CCustomMenu(){if(m_ItemCount>0)//如果菜单项>0,则释放菜单列表delete[]m_MenuList;}向CCustomMenu类中添加GetAllItemCount方法,获取菜单项的数量,当前流程图如下:pMenuCMenu*pMenu=CMenu::FromHandle(hMenu);intemcount=0Multii++i<countinti=0intcount=pMenu->GetMenuItemCount();FirstFindpMenuCMenu*pMenu=CMenu::FromHandle(hMenu);intemcount=0Multii++i<countinti=0intcount=pMenu->GetMenuItemCount();FirstFindNNNYYYNNNYYY向CCustomMenu类中添加AttachMenu方法,附加菜单句柄到CCustomMenu类对象上BOOLCCustomMenu::AttatchMenu(HMENUhMenu){ Attach(hMenu);//附加菜单句柄到菜单对象 GetAllItemCount(hMenu,m_ItemCount);//获取菜单项的数量 if(m_ItemCount>0)//判断菜单项数量是否>0 m_MenuList=newCMenuItem[m_ItemCount];//创建菜单列表 returnTRUE;}(8)向CCustomMenu类中添加SetMenuItemInfo方法,将每个菜单项关联一个CMenuItem结构对象。(9)向CCustomMenu类中添加GetTopMenuWidth方法,获取顶层菜单的高度。流程图如下:intCount=GetMenuItemCount()i<Count::GetMenuItemRect(AfxGetMainWnd()->m_hWnd,m_hMenu,i,rc);i++returnwidth;intCount=GetMenuItemCount()i<Count::GetMenuItemRect(AfxGetMainWnd()->m_hWnd,m_hMenu,i,rc);i++returnwidth;NYinti=0//获取菜单栏中非菜单项区域HRGNCCustomMenu::GetClientMenuRgn()MENUBARINFOMenuInfo;//定义菜单项信息对象memset(&MenuInfo,0,sizeof(MENUBARINFO));//初始化菜单项信息MenuInfo.cbSize=sizeof(MENUBARINFO);//设置菜单项信息结构的大小GetMenuBarInfo(AfxGetMainWnd()->m_hWnd,OBJID_MENU,0,&MenuInfo);CRectrc=MenuInfo.rcBar;//获取菜单栏的区域intMenuCount=GetMenuItemCount();//获取顶层菜单的数量CRect*pRC=newCRect[MenuCount];//定义一个区域指针,记录菜单项区域HRGN*pRgn=newHRGN[MenuCount];//定义一个选区指针,记录菜单项选区CRectwinRC;//定义一个区域对象AfxGetMainWnd()->GetWindowRect(winRC);//获取主窗口区域HRGNretRgn=CreateRectRgn(0,0,0,0);HRGNMenuClientRgn=CreateRectRgn(0,0,0,0);for(intj=0;j<MenuCount;j++)//组合菜单项的区域//去除菜单栏中菜单项的区域,以获取非菜单项区域CombineRgn(retRgn,MenuRgn,MenuClientRgn,RGN_DIFF);for(j=0;j<MenuCount;j++) i<MenuCounti<MenuCounti<MenuCountinWnd()->m_hWi++HRGNMenuRgn=CreateRectRgn(rc.left,rc.top,rc.right,rc.bottom);Rgn(rc.left,rc.top,rintj=0CombineRgn(MenuClientRgn,MenuClientRgn,pRgn[j],RGN_OR);CombineRgn(MenuClientRgn,MenuClientRgn,,以获取非菜单项区域j++Sidebysidej<MenuCountNYNYinti=0MENUBARINFOMenuInfo;(11)向CCustomMenu类中添加SetMenuItemText方法,绘制菜单项文本。voidCCustomMenu::SetMenuItemText(CDC*pDC,LPSTRstrMenuText,CRectRect){ Rect.DeflateRect(20,0); pDC->DrawText(strMenuText,Rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);}(12)向CCustomMenu类中添加DrawTopMenuBk方法,绘制顶层菜单的背景颜色。(13)向CCustomMenu类中添加DrawSepMenu方法,绘制菜单分隔条。voidCCustomMenu::DrawSepMenu(CDC*pDC,CRectRect){ pDC->Draw3dRect(Rect,RGB(255,0,0),RGB(0,0,255));}(14)向CCustomMenu类中添加DrawMenuBk方法,绘制菜单项的背景颜色。voidCCustomMenu::DrawMenuBk(CDC*pDC,CRectRect,COLORREFSrcColor,COLORREFDesColor,BOOL{ if(State) { pDC->Rectangle(Rect); Rect.DeflateRect(1,1); intr1,g1,b1; //读取渐变起点的颜色值 r1=GetRValue(SrcColor); g1=GetGValue(SrcColor); b1=GetBValue(SrcColor); intr2,g2,b2; //读取渐变终点的颜色值 r2=GetRValue(DesColor); g2=GetGValue(DesColor); b2=GetBValue(DesColor); floatr3,g3,b3; //菜单区域水平方向每个点RGB值应该变化的度(范围) r3=((float)(r2-r1))/(float)(Rect.Height()); g3=(float)(g2-g1)/(float)(Rect.Height()); b3=(float)(b2-b1)/(float)(Rect.Height()); COLORREFr,g,b; //菜单区域水平方向每个点的颜色值 CPen*pOldPen; for(inti=Rect.top;i<Rect.bottom;i++) { r=r1+(int)r3*(i-Rect.top); g=g1+(int)g3*(i-Rect.top); b=b1+(int)b3*(i-Rect.top); CPenpen(PS_SOLID,1,RGB(r,g,b)); pOldPen=pDC->SelectObject(&pen); pDC->MoveTo(Rect.left,i); pDC->LineTo(Rect.right,i); pDC->SelectObject(pOldPen); } } else { pDC->FillSolidRect(Rect,RGB(0x000000F9,0x000000F8,0x000000F7)); }}(15)改写菜单类的MeasureItem虚方法,根据菜单项的文本设置菜单项的宽度。lpStruct->itemWidth=size.cx+25;//设置菜单项的宽度(16)改写菜单类的DrawItem虚方法,根据菜单项的不同状态,绘制不同效果的菜单。unsignedintm_state=lpStruct->itemState;//获取菜单项的状态CDC*pDC=CDC::FromHandle(lpStruct->hDC);//获取菜单设备上下文CStringstr=((CMenuItem*)(lpStruct->itemData))->m_MenuText;//获取菜单各项的文本intMenuID=((CMenuItem*)(lpStruct->itemData))->m_MenuType;//获取菜单类型CRectRect=lpStruct->rcItem;//获取菜单项区域pDC->SetBkMode(TRANSPARENT);//设置透明的背景模式switch(MenuID)//判断菜单类型1.5.5自定义工具栏在本系统中为了使程序主界面更加美观,自定义了一个工具栏,效果如图1.4 所示。图1.4自定义工具栏自定义工具栏最简单的方法是处理NM_CUSTOMDRAW消息,在其消息处理函数中根据工具栏按钮的不同状态绘制不同效果的工具栏按钮。具体设计步骤如下。从CToolBar类派生一个子类,本例为CCustomBar。向CCustomBar类中添加变量成员。在CCustomBar类的消息映射部分添加ON_NOTIFY_REFLECT映射宏,用于处理NM_CUSTOMRAW消息。向CCustomBar类中添加OnOwnerDraw方法,表示NM_CUSTOMDRAW消息的处理方法,用于绘制工具栏按钮。向CCustomBar类中添加DrawButton方法,根据工具栏按钮的不同状态,绘制不同效果的工具栏按钮。1.6主要功能模块的设计1.6.1系统架构设计为了使读者能够对系统文件有更清晰的认识并了解其使用方法,在此设计了文件架构图,如图1.5所示。CMainFrame(系统主界面) 像图像显示图像转换图像处理字符识别帮助图1.5主文件架构图图像显示文件架构图和图像转换文件架构如图1.6和图1.7所示。CShowImageCShowImage显示位图CShowJPEG显示JPEGCShowGIF显示GIF图像显示图1.6图像显示文件架构图CBmpToJpegCBmpToJpeg位图转换为JPEGCJpegToBmpJPEG转换为位图CBmpToGif位图转换为GIF图像转换CGifToBmpGIF转换为位图图1.7图像转换文件架构图图像处理文件架构图和字符识别文件架构图如图1.8和1.9所示。帮助文件架构图如图1.10所示。CRotationImageCRotationImage 图像旋转CBmpSharp图像锐化处理CReverseColor图像反色处理图像处理CGrayHandle灰度化处理CLineArity线性变换图1.8图像处理文件架构图 字符识别CRecNumber帮助CAboutDlg手写数字识别关于图1.9字符识别文件架构图图1.10帮助文件架构图1.6.2公共模块设计在设计图像效果显示时,有些图像可能比较大,在窗口中不能完全显示出来。为了让用户能够浏览图像,可以单独设计了一个滚动窗口,当控件设置在窗口中,用户可以通过滚动条来浏览控件的各个部分。滚动窗口的设计步骤如下。(1)创建一个对话框,类名为“CImageContainer”,设置对话框的属性。(2)处理对话框的WM_HSCROLL消息,设置窗口的滚动方向和范围。代码如下:(3)处理对话框的VSCROLL消息,设置窗口的滚动方向和范围。代码如下:caseSB_PAGELEFT://在滚动块的左方空白滚动区域单击,增量为6caseSB_PAGERIGHT://在滚动块的右方空白滚动区域单击,增量为6(4)处理对话框的WM_MOUSEWHEEL消息,响应鼠标的滚轮事件。代码如下:GetScrollInfo(SB_VERT,&vinfo);//获取滚动条信息intmin,max,thumbwidth; min=vinfo.nMin; max=vinfo.nMax; thumbwidth=vinfo.nPage; intpos=GetScrollPos(SB_VERT);//获取垂直滚动条位置 SetScrollPos(SB_VERT,pos-6);//设置垂直滚动条的位置 ScrollWindow(0,6);//滚动窗口1.6.3主窗体设计1.实现目标图像处理系统主窗体主要由菜单、工具栏、客户区域和状态栏4部分组成,主要功能是对图像处理系统的各个模块进行调整。图像处理系统主窗体的运行效果如图1.11所示。1.11图像处理系统主窗体的运行效果2.设计步骤(1)创建一个单文档/视图结构的应用程序,工程名称为“ImageHandle”。(2)在工作区的资源视图窗口中修改菜单资源ID为“IDR_MAINMENU”,设置菜单项的效果如图1.12所示。图1.12菜单资源设计菜单资源文件代码如下:IDR_MAINMENUMENUDISCARDABLEBEGINPOPUP“图像显示”BEGINMENUITEM“显示位图”,ID_MENUSHOWBMPMENUITEM“显示JPEG”,ID_MENUSHOWJPGMENUITEM“显示GIF”,ID_MENUSHOWGIFENDPOPUP“图像转换”BEGINMENUITEM“位图转换为JPEG”,ID_MENUBMPTOJPEGMENUITEM“JPEG转换为位图”,ID_MENUJPEGTOBMPMENUITEM“位图转换为GIF”,ID_MENUBMPTOGIFMENUITEM“GIF转换为位图”,ID_MENUGIFTOBMPENDPOPUP“图像转换”BEGINMENUITEM“图像旋转”,ID_MENUROTATIONMENUITEM“图像锐化处理”,ID_MENUBMPSHARPMENUITEM“图像反色处理”,ID_MENUREVERSECOLORMENUITEM“灰度化处理”,ID_MENUGRAYHANDLEMENUITEM“线性变换”,ID_MENULINEARITYENDPOPUP“图像转换”,BEGINMENUITEM“手写数字识别”,65535ENDPOPUP“图像转换”,BEGINMENUITEM“随机颜色”,ID_RANDOMCOLORMENUITEM“固定颜色”,ID_FIXCOLORENDPOPUP“图像转换”,BEGINMENUITEM“关于…”,ID_ABOUTENDEND3.代码分析(1)在应用程序类的InitInstance方法中修改单文档模板构造函数的参数,由于之前修改了菜单资源ID,因此构造函数的参数应设置为新的菜单资源ID。代码如下:CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINMENU,RUNTIME_CLASS(CImageHandleDOC),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CImageHandleView));AddDocTemplate(pDocTemplate);(2)在主窗口(框架类)的头文件中引用自定义菜单和工具栏类的头文件。代码如下:#include“CustomMenu.h”#include“CustomBar.h”(3)向框架类的头文件中添加成员变量。代码如下:CStausBarm_wndStatusBar;CCustimBarm_wndToolBar;CImageListm_ImageList;CCustomMenum_Menu;(4)在创建框架窗口时创建菜单、工具栏和状态栏。代码和流程图如下:m_wndToolBar.SetButtonText(0,"显示位图");m_wndToolBar.SetButtonText(1,"显示JPEG");m_wndToolBar.SetButtonText(2,"显示GIF");m_wndToolBar.SetButtonText(4,"位图转换JPEG");m_wndToolBar.SetButtonText(5,"JPEG转换位图");m_wndToolBar.SetButtonText(6,"位图转换GIF");m_wndToolBar.SetButtonText(7,"GIF转换位图");m_wndToolBar.SetButtonText(9,"图像旋转");m_wndToolBar.SetButtonText(10,"线性变换"); YYYNNlpCreateStruct->hMenu=LoadMenu(AfxGetResourceHandle(),MAKEINTRESOURCE(lpCreateStruct));return-1;!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))m_ImageList.Create(30,25,ILC_COLOR32|ILC_MASK,1,1);TRACE0("Failedtocreatestatusbar\n");CFrameWnd::OnCreate(lpCreateStruct)==-1SideBySide(5)在视图类的OnDraw方法中绘制背景图像。代码如下: CImageHandleDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); ::SetWindowText(GetParent()->m_hWnd,"图像处理软件"); CBitmapbmp;//定义位图对象 bmp.LoadBitmap(IDB_MAINBMP);//加载位图 CDCmemDC; memDC.CreateCompatibleDC(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年换电“战国时代”终结:全国统一标准箭在弦上
- 2026年汽车芯片关键部件认证审查与上车验证流程
- 2026年消防疏散培训
- 2026年高空幕墙清洁机器人吸附系统与路径规划安全设计
- 体育教师资格证中体育游戏的设计组织
- 2026年网络安全操作培训
- 2026年食疗与中医按摩调理脾胃虚弱实操培训课件
- 泌尿外科微创手术护理配合
- 情绪护理技巧解析
- 2025-2026学年内蒙古赤峰市翁牛特旗七年级(上)期末道德与法治试卷(含答案)
- 武汉启瑞药业有限公司及产品介绍
- 2026广东深圳市龙岗区宝龙街道招考聘员14人(2603批次)笔试备考试题及答案解析
- 2026年安徽城市管理职业学院单招职业适应性考试题库附参考答案详解(a卷)
- 2026四川成都传媒集团人力资源服务中心售前工程师、内控法务专员等岗位招聘4人笔试备考试题及答案解析
- 2026北京水务投资集团有限公司招聘9人笔试备考试题及答案解析
- 2026西安商贸物流集团有限公司招聘(27人)考试参考试题及答案解析
- 2026高三二轮复习策略
- 2025年度执法资格模拟试题含答案详解
- 2026届高三历史复习策略与核心考点精讲
- GB/T 46821-2025嵌入式基板测试方法
- 华为合规新管控机制
评论
0/150
提交评论