毕业论文_基于vc的图像处理系统设计与实现(编辑修改稿)内容摘要:

//选中之前选中的对象 If(m_pbmp!=NULL) //判断位图对象是否为空 delete m_pbmp; //释放位图对象 DelectObject(this); //释放设备上下文 内存画布 CMemDC 只包含一个构造函数和析构函数,其中,在构造函数部分,将根据参数 pDC 创建一个兼容的设备上下文,并且将 pDC 的内容绘制在内存画布上;在析构函数中,会将内存画布的内容输出到目标设备的上下文中。 自定义全局函数 在 Visual C++中没有提供直接的函数用于获取文 件的名称(去除扩展名)和获取文件的扩展名(去除文件名)。 为此,定义了两个全局函数来获取文件的名称和文件扩展名。 函数定义如下: CString ExtractFileName(CStringamp。 str) //获取文件名称 { intpos=(‘.’)} //反向查找 “ .” 的位置 return (pos); //从左方开始截取字符串,并返回截取的字符串 } CString GetFileExtended Name (CStringamp。 strFile) //获取文件扩展名 { int pos=(‘.’); //反向查找“ .”的位置 return (()pos1) } 在为本系统设计自定义菜单时,由于主界面对话框的宽度可以调整,导致菜单栏的高度会发生变化,如图 所示。 图 菜单栏高 度 从 中可以发现,当对话框的宽度变化时,菜单栏的高度也会发生变化,这在绘制菜单的背景颜色时候会带来困难,需要从 动态链接库中导出 菜单栏高度 5 该函数。 流程图如下: 自定义菜单 为了使程序界面更加美观,在本系统中自定义了一个菜单,实现菜单的特殊效果显示,如图 所示 : 图 自定义菜单 在 Visual C++中,实现自定义菜单是比较容易的, MFC 类库提供了 CMenu 类用于 设计菜单,用户只要从该类派生一个子类,然后改写 MeasureItem 方法,hModule 址 void*pVoid=(void*)GetProcAddress(hModule,GetMenuBarInfo)。 pVoid 数 ((FunGetMenuInfo)pVoid)(hwnd,idObject, ::FreeLibrary(hModule)。 资源 ::FreeLibrary(hModule)。 资源 N Y N Y HMODULEhModule=::LoadLibrary()。 6 设置菜单项的高度和宽度;改写 DrawItem 方法,根据菜单项的不同状态,绘制不同效果的菜单项就可以了。 具体设计如下 : (1) 从 CMenu 类派生一个子类 CCustomMenu。 (2) 定义一个菜单项结构 CMenuItem,记录菜单项的信息。 代码如下: //定义一个结构,记录菜单项的详细信息 Struct CMenuItem { CString m_Menutext。 //菜单项的文本 UINTm_ImageIndex。 //菜单项图像索引 Int m_MenuType。 // 菜单项的类型 2:顶层菜单, 1:弹出式菜单, 0:分隔条,其他:普通菜单 (3) 向 CCustomMenu 类中添加成员变量。 (4) 在 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。 //是否采用随机颜色 } (5) 在 CCustomMenu 类的析构函数中释放成员变量占据的堆空间。 CCustomMenu::~CCustomMenu() { if (m_ItemCount 0) //如果菜单项 0,则释放菜单列表 delete []m_MenuList。 } (6) 向 CCustomMenu 类中添加 GetAllItemCount 方法,获取菜单项的数量,当前流程图如下: 7 (7) 向 CCustomMenu 类中添加 AttachMenu 方法,附加菜单句柄到CCustomMenu 类对象上 BOOL CCustomMenu::AttatchMenu(HMENU hMenu) { Attach(hMenu)。 //附加菜单句柄到菜单对象 GetAllItemCount(hMenu,m_ItemCount)。 //获取菜单项的数量 if (m_ItemCount 0) //判断菜单项数量是否 0 m_MenuList = new CMenuItem[m_ItemCount]。 //创建菜单列表 return TRUE。 } (8)向 CCustomMenu 类中添加 SetMenuItemInfo 方法,将每个菜单项关联一个 CMenuItem结构对象。 (9)向 CCustomMenu类中添加 GetTopMenuWidth方法,获取顶层菜单的高度。 流程图如 下: CMenu*pMenu=CMenu::FromHandle(hMenu)。 pMenu FirstFind intcount=pMenuGetMenuItemCount()。 inti=0 icount i++ Multi intemcount=0 Y Y Y N N N 8 (10)向 CCustomMenu 类中添加 GetClientMenuRgn 方法,获取菜单栏中的非菜单项区域。 流程图如下: //获取菜单栏中非菜单项区域 HRGN CCustomMenu::GetClientMenuRgn() MENUBARINFO MenuInfo。 //定义菜单项信息对象 memset(amp。 MenuInfo,0,sizeof(MENUBARINFO))。 //初始化菜单项信息 = sizeof(MENUBARINFO)。 //设置菜单项信息结构的大小 GetMenuBarInfo(AfxGetMainWnd()m_hWnd,OBJID_MENU,0,amp。 MenuInfo)。 CRect rc =。 //获取菜单栏的区域 int MenuCount = GetMenuItemCount()。 //获取顶层菜单的数量 CRect *pRC = new CRect[MenuCount]。 //定义一个区域指针,记录菜单项区域 HRGN *pRgn = new HRGN[MenuCount]。 //定义一个选区指针,记录菜单项选区 CRect winRC。 //定义一个区域对象 AfxGetMainWnd()GetWindowRect(winRC)。 //获取主窗口区域 HRGN retRgn = CreateRectRgn(0,0,0,0)。 HRGNMenuClientRgn = CreateRectRgn(0,0,0,0)。 for (int j=0。 jMenuCount。 j++) //组合菜单项的区域 //去除菜单栏中菜单项的区域,以获取非菜单项区域 CombineRgn(retRgn,MenuRgn,MenuClientRgn,RGN_DIFF)。 for ( j=0。 jMenuCount。 j++) intCount=GetMenuItemCount() iCount ::GetMenuItemRect(AfxGetMainWnd()m_hWnd,m_hMenu,i,rc)。 i++ returnwidth。 N Y inti=0 9 (11)向 CCustomMenu 类中添加 SetMenuItemText 方法,绘制菜单项文本。 void CCustomMenu::SetMenuItemText(CDC *pDC, LPSTR strMenuText, CRect Rect) { (20,0)。 pDCDrawText(strMenuText,Rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT)。 } (12)向 CCustomMenu 类中添加 DrawTopMenuBk 方法,绘制顶层菜单的背景颜色。 (13)向 CCustomMenu 类中添加 DrawSepMenu 方法,绘。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。