实例介绍
MFC资源管理器,制作步骤相当详细,很适合初学者,而且制作后效果也很美观!!!
点击 Finish按钮,创建框架 C器在me CMy Explore nApp yExplaret Bage elass Impkcmcnlatea file: c Back Ned >Finish Caner 图11-6 MFC App wizard-Step4对话框 添加控件资源 利用 Visaul o++的资源编辑器为工程的主对话框 IDD MYEXPLORER DIALOG添 加控件资源。根据该资源管理器的功能需求,分别为对话添加静态文本框Ⅰ C STATIC, 编辑框 IDC URL,按钮控件 IDC REDIRECT,树形控件 IDC TREE,列表框控件 IDC LIST。添加控件后的对话框资源如图11-7所示。 eXplorer -.83 Expanded Node 黑 Expande d Node +2 Coll 图11-7添加完控件后的对话框资源 控件ID,控件类型和控件用途的对应关系如表11-1所示。 表 主对话框资源清单 控件 控件类型 控件用途 IDC STATIC 静态文本框 显示提示信息 IDC URL 编辑框 输入全路径 IDC REDIRECT 按钮控件 执行“转到”操作 IDC TREE 树形控件 显示文件夹层次列表 IDC LIST 列表控件 显示文件列表 Visual c++简明教程 再利用 MFC Class wizard将控件与主对话框类的成员变量关联起来。在 Class wizard 对话框上的 Member variable选项卡进行关联操作,如图11-8所示。 Message Maps Member Variables Automation ActiveX<Events I c Add class.: MYExplurer l CMyExplorerDls D:-TMyExplorerDlgh D\yMyExploterDig cpp Add Variable.. TREE Chirlreettrl m wndfree IOC URL Hinn All OK Cancel 图11-8为对话框控件添加关联变量 添加菜单资源 利用 Visual c++为工程添加菜单资源 IDR MENU MAINFRAME,并对其进行编缉。 编辑后的菜单资源如图11-9所示。 文件〕编〖〕查看)帮助⑩ 拷贝c 前切 粘贴① 0T己rte w Resource ID:DR MENU MAINFRAME Preview: FO TE m- Language: Chinese(P.RC-] 关图 Condition 图11-9菜单资源 IDR MENU MAINFRAME 菜单 IDR MENU MAINFRAME的菜单项ID,菜单项名称,菜单项用途对应关系 如表11-2所示。 表 菜单 清单 菜单 菜单名称 用途 IDM FILE OPEN 打开 打开目录 IDM FILE CLOSE 关闭 关闭目录 IDM EDIT COPY 拷贝 拷贝选取的文件 IDM EDIT CUT 剪切 剪切选取的文件 IDM EDIT PASTE 粘贴 粘贴选取的文件 IDM EDIT DELETE 删除 删除选取的文件 IDM VIEW FOLDER 文件夹 打开树视图 IDM ABOUT 关于 查看相关信息 实现系统图标列表类 为工程添加新类 CSystemImageList,用于完成与文件图标信息相关的操作。该类提 供了获取 Windows操作系统所有的文件图标的功能,并且提供了获取指定文件的图标句 柄的功能。 选择主菜单上的 Insert命令,将弹出 Insert子菜单;弹出的子菜单上,选择 New Class 命令,将弹出 New class对话框。在 New Class对话框的 Class Type下拉列表框中选择 Generic Class,在编辑框Name中输入 CSystemImageList,编辑框 Derived from中输入 CObject,派生类型下拉列表框选则 Public。单击OK按钮,向工程添加系统图标列表 CSystemImageList类。如图11-10所示 Claes information Cancel e SyelemlmME LIsECpP 图11-10添加 CSystemImagelist类 在 CSystemImageList类中添加两个图像列表类的静态指针变量,分别用于存储操作 系统的大图标链表和小图标链表;添加一个整数型静态变量,用于统计 CSystemImageList 类被使用的次数;并且添加相关功能的成员函数。 CSystemImageList类的声明如下 CSystemlmagelist类的声明 class CSystemImageList: public Cobject private static CImageList* m gplargelmagelist;∥大图标链表 static CImageList* m gpSmalllmagelist;∥小图标链表 static int m gRefCount;/)计数器 private ∥始化静态列表 BOOL InitGlobalList( CimageList"& rpImageList, booL bSmall-TRUE ∥销毁静态链表 Visual c++简明教程 void Destroy GlobalList( CImageList*& rpImageList public CSystemImageListo ∥/构造函数 virtual~ CSystemImageList(;∥析构函数 ∥得到图标链表 CImageList* Getimage List( bool sMall= TRUE )const; ∥得到指定文件的图标 HICON GetIcon( const CString& sName, booL bOpen-- FALSE, bool bSmall- TRUE ); }; 初始化图标链表 初始化图标链表的工作是在构造函数中完成的。在 CSystemImageList类的构造函数 CSystemImageList中,对 m gRefCount的值进行判断。 如果 m gRefCount的值等于0,说明链表还未初始化,那么通过调用成员函数 Initgloballist完成进行初始化链表的工作。 如果 m gRefCount的值不等于0,说明链表已经初始化,那么将计数器 m gRefCount 加1 其实现代码如下 构造函数 CSystemImageList: CSystemlmageListo if( m gRefCount==0)∥如是计数器为0,说明还未初始化 ASSERT(! m gpSmallImageList && m gpLargelmageList Initgloballiste( m gpSmalllmagelist,TRUE);∥初始化小图标链表 Initgloballist( m gpLargelmagelist, FALSE);∥初始化大图标链表 m gRefCount++;/计数器加1 为 CSystemImageList类添加成员函数 Initgloballist,在其中完成对链表初始化的功 能。在函数 Initgloballist中,获取操作系统的图标链表,并将其保存到参数 rpImagelist 中。其实现代码如下: ∥始化链表 BOOL CSystemImageList: InitGlobalList( CImageList*& rplmageList, booL bSmall bool bRet= FALSE if(! rpImageList)∥如果链表为空 { pImagelist= new CImageList;∥分配内存 if( rplmagelist)/如果分配内存成功 SHFILEINFO Sfi dWORd dw Flags= SHGFI USEFILEATTRIBUTESSHGFI SYSICONINDEX if( sMall)∥/指定图标的大小 dw Flags SHGFI SMALLICON size t size= sizeof( shfileinfo ); 获取操作系统图标链表 dord dw= SHGetFileInfo( NULL, FILE ATTRIBUTE NORMAL &sfi, size, dw Flags ) rplmagelist-> Attach(( HIMAGELIST)dw);∥保存链表 rplmagelist-> Setbk color( CLR NONE);∥设置背景模式 bRet= TRUE return( bRet ) 销毁图标链表 为 CSystemImageList类添加私有成员函数 Destroy GlobalIst,在其中完成销毁图标 链表的操作。在函数 Destroy Globalist中,对指针 rpImageList进行判断,如果该指针 不为空,则将图标链表对象与图标链表对象的句柄分离,并销毁图标链表。如果在销毁 图标链表销毁前没有将图标链表对象与图标链表对象的句柄分离,那么系统的图标链表 也会被破坏,就会导致系统异常。 其实现代码如下: 销毁图标链表 void CSystemImageList: Destroy GlobalList( CImageList*& rplmageList if( rplmageList)∥判断图像链表指针是否为空 rplmagelist> Detach;∥将图标链表对象与图标链表对象的句柄分离 delete rplmageList ∥销毁图标链表 pImageList= NULL Visual c++简明教程 CSystemImageList类的析构函数在其对象销毁时将会被自动调用,在析构函数中, 对计数器 m gRefCount进行减1操作,并判断其是否为0。如果 m gRefCount的值为0, 说明所有 CSystemImageList类的对象均已被全部销毁,那么就调用 CSystemImageList 类的成员函数 Destroy GlobalIst,完成对链表的销毁操作 其实现代码如下 /析构函数 CSystemlmageList: CSystemlmageListO m gRefCount-;/将计数器减1 f( m rEcoUnt==0)∥如果 CSystemlmageList类的对象已经全部被销毁 Destroy GlobalIst( m gpLargelmageList);∥销毁大图标链表 Destroy Globalist( m gpSmalllmageList);∥销毁小图标链表 获取图标 CSystemImageList类提供了两种方式向外部提供图标获取的功能,一种是根据参数 直接返图像大图标链表指针或小图标指针,另一种是根据参数,返回指定文件的图标句 为 CSystemImagelist类添加成员函数 GetlmageList,在其中完成根据参数直接返图 像大图标链表指针或小图标链表指针的功能。在函数 GetlmageList中,对其入口参数 sMall进行判断,如果 sMall的值为TRUE,那么返回小图标链表指针,如果 sMall 的值为 FALSE,则返回大图标链表指针。 其实现代码为 返回链表指针 CImageList* CSystemImageList: GetlmageList( bool bSmall /*=TRUE*/)const CImageList *pList- NULL if( sMall) pList=m gp SmalllmageList plist=m gpLargelmagelist return( pList ) 为 CSystemlmageList类添加成员函数 GetIcon,在其中完成根据参数返回指定文件 的图标句柄的功能。在函数 GetIcon中,对其入口参数进行判断,获取指定的文件名和 图标属性,并调用相应的 WindOws api函数,获取文件的属性。 其实现代码如下 返回指定文件的图标句柄 HICON CSyStemlmageList: GetIcon( const CString& sName, BOoL bOpen, booL bSmall SHFILEINFO Sfi 指定属性 dWoRd dw FlagS= SHGFI DISPLAYNAME SHGFI ICON SHGFI LARGEICON size t size= sizeof( SHFILEINFO);/得到缓冲区大小 if( sMall) dw Flags|= SHGFI SMALLICON;∥指定小图标属性 f( oPen dw Flags =SHGFI OPENICON 指定打开图标属性 ∥获取文件属性 SHGetFileInfo( sName, NULL, &sfi, size, SHGFI DISPLAYNAME SHGFI ICON SHGFI LARGEICON) return( sfi.hIcon);/返回图标句标 实现高级树形控件类 利用 MFC Class Wizard为工程添加一个新类 CDirfreeCtr类。如图11-11所示 P度 EXplorer Name. COi Trcclul DA.WMExp File same G布西 The Bair Flats dasi mnl trquirr a diala tauter 己b己 w Oninia N得 d OnOn w OnLy r Create atle try te ID 图11-11添加 CDir Ctr类 添加新类名称为 CDir ctrl,其父类为 CTreeCtrl类。下面就在 CDirtree ctrl类中 实现高级树形控件 初始化树形控件 为 CDirTree Ctrl类添加成员函数 Initialize,在其中完在对控件的初始化功能。在 Initialize函数中,主要进行向树控件的根部插入“我的电脑”和“桌面”两个节点的操 Visual c++简明教程 作。 在 Initialize函数中,分别调用 Insertltems函数向树控件的根节点处插入“我的电脑” 项和调用 AddIton函数向树控件的根节点处插入“桌面”项。其实现代码如下 ∥/初始化树控件 void CDir Tree Ctrl: Initialize LPITEMIDLIST itemlist char buf 256 int iDesktoplcon int iComputerIcon; DeleteAllltems(;∥清空所有控件节点 Setlmagelist(NUL,O);∥将控件的图像链表设为空 ∥得到“桌面”的磁盘全路径 SHGetSpecialFolderLocation(this->m hWnd, CSIDL DESKTOP, &itemlist) SHGetPath FromIDList(itemlist, buf m DesktopPath=; ∥创建图标链表 n ImageList. Create( GetSystemMetrIcS(SM CXSMICON GetSystemMetrICS(SM CYSMICON), Ⅱ LC COLOR24,50,50) ∥设置背景色 m ImageList. SetBk Color( GetSys Color(COLOR WINDOW)) iDesktopIcon= m ImageList. Add(∥将“桌面”图标加入链表 ExtractIon( Afx GetAppo> m hInstance," 'shell2d",34);/得到“桌面”图标 iComputerIcon= m ImageList. Addo∥将“我的电脑图标加入链表” ExtractIon( Afx GetA> m hInstance," shell2.d",15);∥得到“我的电脑”图标 m Drives root= InsertItems("我的电脑", TVI ROOT,true, iComputerIcon, iComputerIcon); m Desktoproot= AddItem(m DesktopPath, TVI ROOT, true, iDesktopIcon, iDesktopIcon) 为 CDirTree Ctrl类添加成员函数 Additem,在其中完成向树控件中插入节点的功能。 在 Additem函数中,首先进行插入节点的准备工作,其次调用另一成员函数 Insertltmes 完成节点的插入工作 其实现代码如下 向树控件中插入节点 HTREEITEM CDirTree Ctrl: AddItem(const char *path, HTREEITEM parent bool isDir, int icon Ex, int icon Ex2) 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论