您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:147 来源:vckbase.com

本文章共7979字,分5页,当前第2页,快速翻页:
 
菜单编辑器中没有分割条菜单的菜单


逆风者

原CMenuEx执行的模样



菜单编辑器中有分割条菜单的菜单



原CMenuEx执行的模样



  • 代码不够简练,程序粒度划分不好,可读性差(不过比BCMENU的代码可读性强多了:))。

  • 二、解决问题

      针对以上遇到的问题,我参考BCMENU和原作者的CMenuEx,对CMenuEx类重新进行了组织,类定义如下:

    // 声明,因为下面的结构要用到 CMenuEx*,又不支持向后引用,又什么办法啊!
    
    class CMenuEx;
    
    //自绘菜单数据项结构,就是要传给系统的那个牛X的LPCTSTR指针所指向的东东
    
    class CMenuEx : public CMenu
    
    {
    
    	DECLARE_DYNAMIC( CMenuEx )
    
    		
    
    // Constructor
    
    public:	
    
    	CMenuEx();	
    
    	virtual ~CMenuEx();
    
    	virtual BOOL DestroyMenu();
    
    	
    
    // Operation
    
    public:
    
    	// 加载菜单操作
    
    	BOOL LoadMenu(UINT nIDResource);
    
    	BOOL LoadMenu(LPCTSTR lpszResourceName);
    
    	BOOL LoadMenu(HMENU hMenu);
    
    	BOOL LoadMenu(CMenu & Menu);
    
    	
    
    	// 菜单项操作,如果当前菜单为主菜单(top-level)就调用相应的CMenu的操作。如果是弹出菜单,
    
             // 就将新加入的菜单项定义为自绘菜单
    
    	BOOL AppendMenu(UINT nFlags, UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL);
    
    	BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL );
    
    	BOOL ModifyMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL );	
    
    	BOOL RemoveMenu(UINT nPosition, UINT nFlags);	
    
    	
    
    	// 加载菜单图像操作
    
    	//通过菜单索引表加载图像索引,此操作必须在设置过菜单图像后调用
    
    	void SetImageIndex(const UINT* nIDResource,UINT nIDCount);
    
    	void LoadToolBar(const CToolBar* pToolBar);// 通过工具栏加载图像,和图像索引
    
    	
    
    	// 取自绘菜单项的数据项
    
    	UINT  GetMenuItemSize() const;
    
    	LPMENUITEM GetMenuItem(UINT nPosition);	
    
    	
    
    	// 取子菜单操作,如果位置nPosition存在子菜单,返回该子菜单指针
    
    	// 如果不存在子菜单,返回NULL
    
    	CMenuEx* GetSubMenu(int nPosition);
    
    	// 在当前菜单和所以子菜单中中寻找相应ID
    
    	// 如果找到,返回ID所在菜单的指针,没找到返回NULL
    
    	CMenuEx* FindPopupMenuFromID(UINT nID);
    
    	
    
    // Attributes
    
    protected:
    
    	// 指示为主菜单(top-level menu or menubar)还是弹出菜单(popupmenu)
    
    	BOOL m_bPopupMenu;
    
    	
    
    	// 分割条的默认高度
    
    	int m_nSeparator;
    
    	
    
    	// 绘制菜单需要的颜色
    
    	COLORREF m_crBackground;		// 菜单背景色	
    
    	COLORREF m_crTextSelected;		// 菜单项被选中时的文字颜色
    
    	COLORREF m_crText;			// 菜单项文字颜色
    
    	COLORREF m_crLeft;			// 菜单左侧的背景颜色
    
    	COLORREF m_crSelectedBroder;		// 菜单选中框的线条颜色
    
    	COLORREF m_crSelectedFill;		// 菜单选中框的填充颜色
    
    	
    
    	// 菜单项图像的尺寸	
    
    	CSize m_szImage;
    
    	
    
    	CImageList* m_pImageList;		// 菜单项正常的图像列表 
    
    	CImageList* m_pDisabledImageList;	// 菜单项禁用时的图像列表
    
    	CImageList* m_pHotImageList;		// 菜单项被选中时的图像列表
    
    	
    
    protected:
    
    	// 包含所有菜单项的数组
    
    	CArray m_MenuItemArr;
    
    	
    
    public:
    
    	// 设置颜色操作
    
    	void SetTextSelectedColor(COLORREF color);
    
    	void SetBackgroundColor(COLORREF color);
    
    	void SetTextColor(COLORREF color);
    
    	void SetLeftColor(COLORREF color);
    
    	void SetSelectedBroderColor(COLORREF color);
    
    	void SetSelectedFillColor(COLORREF color);
    
    	
    
    	// 设置图像列表操作
    
    	void SetImageList(CImageList* pImageList);
    
    	void SetDisabledImageList(CImageList* pImageList);
    
    	void SetHotImageList(CImageList* pImageList);
    
    	
    
    	// 设置当前菜单为主菜单还是弹出菜单
    
    	void SetPopupMenu(BOOL bPopupMenu);
    
    	
    
    	// Implementation
    
    public:
    
    	// 绘制菜单项的虚拟函数,由MFC框架自动调用
    
    	virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
    
    	
    
    	// 更新弹出菜单菜单项操作
    
    	// 因为有时候系统会通过菜单句柄插入一些非自绘菜单
    
    	// 该函数就是更新这些非自绘菜单为自绘菜单
    
    	void UpdatePopupMenu();
    
    	
    
    protected:
    
    	// 绘制菜单项的辅助函数,想自己的菜单看上去更COOL,就拿他们开刀
    
    	void DrawBackground(CDC* pDC,CRect rect);
    
    	void DrawMenuImage(CDC* pDC,CRect rect,LPDRAWITEMSTRUCT lpDIS);
    
    	void DrawMenuText(CDC*  pDC,CRect rect,LPDRAWITEMSTRUCT lpDIS);
    
    	void DrawSelected(CDC*  pDC,CRect rect,LPDRAWITEMSTRUCT lpDIS);
    
    	
    
    	// Static Member
    
    public:
    
    	// 在CMainFrame的OnMeasureItem()消息映射函数中调用它,用来测量所有菜单项尺寸
    
    	static void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
    
    	
    
    	// 在CMainFrame的OnInitPopupMenu()消息映射函数中调用它,
    
    	// 用来更新系统自动添加的菜单项为自绘菜单
    
    	static void InitPopupMenu(CMenu* pPopupMenu,UINT nIndex,BOOL bSystem);
    
    	
    
    };
    
    #endif // !defined(MENUEX_H)
     
    本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 5 - 下一页>>
    相关文章

    控件如何传递自定义struct
    文件系统识别器
    用 ATL ActiveX 绘制任意平面函数的曲线
    软件框架的利器、TangramMini组件应用教程四
    如何让一个打开的文档成为活动文档
    消息值,托管字符串,扰乱代码及其它
    修改一个完全颜色的CListCtrl类
    编程之道
    更新MFC中的视图,跟踪.NET Framework中的事
    常用编码详解
    VC 6.0 中如何使用 CRT 调试功能来检测内
    软件开发专业相关的英文简历及其资源
    定制调试诊断工具和实用程序——摆脱DLL“地
    发掘 C# 特性赋予科学计算项目以威力
    《系统飞狐》中获取系统信息的方法
    使用 Http 在线自动升级程序
    UTF-8与GB2312之间的互换
    在VC中调用DirectShow全屏播放视频
    案例研究:If-Trader 订单流程处理系统
    介绍一个操作DHTML表格的C 对象

    相关评论


    本文章所属分类:首页 VC++

      热门关键字: