⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cnmenu.h

📁 模拟popo的一个程序
💻 H
字号:
/**********************************************************************
//				类Office XP、OICQ外观的菜单类
//						-- 抽取自 临风程序界面类库CNdows.lib
//
//作者:临风        整理:cicn
//
//版本:0.1
//
//声明:  本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到
//		  你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在
//		  修改的同时给作者一份同样的副本。
//		  本类库不得用于任何商业用途,如确实需要,请与作者联系。
//
//e-mail:cicn@163.com
//
//原文件名:rcm.h
//
//说明:CNmenu 类定义文件
//
**********************************************************************/


#ifndef _INC_CNDOWAPP
#define _INC_CNDOWAPP


// 通用函数声明
void Errmsg(LPSTR format,...);
LPVOID New(DWORD dwSize);
LPVOID Del(LPVOID lpv);


class CNCoolMenu;

typedef struct _tagCNMenuStyle
{
	HICON hIcon;
	CNCoolMenu* pMenu;
	UINT uID;
}CNMENUSTYLE,*LPCNMENUSTYLE;


#define MENURECT_UP		BDR_RAISEDINNER
#define MENURECT_DOWN		BDR_SUNKENOUTER

#define MENUMARKER_EXT		24		//标记图案中扩展图案高度,该扩展图案是为MENU高度>标记图案时
						//绘制剩余部分而设,该扩展图案必须位于标记图案顶部并高度为该数值
						//资源文件中的标记图案必须符合上述规则
#define MENUSEP_HEIGHT	  	6		//菜单分割线所占菜单项高度
#define MENUCHECK_CHECKBOX	0		//Menu Check图案是CHECKBOX
#define MENUCHECK_RADIO		12		//Menu Check图案是RADIO


typedef struct _tagCNMenuGlobalStyle
{
	HBITMAP hbmBkg;					//背景图象
	HBRUSH hbrBkg;					//背景颜色
	HBITMAP hbmHilight;				//选中菜单图案
	HBRUSH hbrHilight;				//选中菜单的颜色
	HPEN hPen;					//留用
	COLORREF crText;				//选中菜单的文字颜色
	COLORREF crTextDef;				//未选中菜单颜色(默认颜色)
	UINT uSelectRect;				//选中菜单是凸起或凹下,MENURECT_UP 或 MENURECT_DOWN

	//以下标记图案(即类似OICQ菜单左边的一条图案)信息
	HBITMAP hbmMarker;				//标记图案
	UINT uMarkerX,uMarkerY;				//标记图案宽,高
	UINT uBkgY;					//背景高度
	int nMenuHeight;				//菜单总高度
}MENUGLOBALSTYLE,*LPMENUGLOBALSTYLE;


#define BY_COMMAND 		MF_BYCOMMAND	//插入菜单位置指定方式
#define BY_POSITION 		MF_BYPOSITION

#define MAX_MENUTEXT		81			//菜单最多显示字数
#define MENU_PER_INSERT		20			//每次增加菜单项数量(CNCoolMenu用)

#define COLOR_TRANSPARENT	0xffffffff		//透明色(以下定义菜单用)
#define COLOR_DEF		0xfffffffe		//默认色
#define COLOR_PREV		0xfffffffd		//上一次的颜色(用于SetColor()中不想改变的颜色)


typedef void (*FUNC_COOLMENU_DRAWITEM)(CNCoolMenu*,LPDRAWITEMSTRUCT);
//定义结束


extern "C"
{
   void CNCoolMenu_DrawItem_def(CNCoolMenu* rm,LPDRAWITEMSTRUCT lps);
   void CNCoolMenu_DrawItem_XP(CNCoolMenu* rm,LPDRAWITEMSTRUCT lps);	//Office XP 类型菜单选中项的绘制
}


class CNMenu
{
public:
	CNMenu(HINSTANCE hInst);
	CNMenu(HINSTANCE hInst, LPCTSTR lpMenuname);
	virtual ~CNMenu();

	BOOL Create();
	BOOL CreatePopup();
	void Destroy(){DestroyMenu(m_hMenu);};

	virtual BOOL Load(LPCTSTR lpMenuname);
	virtual BOOL LoadPopup(LPCTSTR lpMenuname,UINT nIndex = 0);
	virtual BOOL Attach(HMENU hMenu);
	virtual HMENU Detach();
	BOOL Popup(HWND hWnd,int x=-999,int y=-999);			//使用默认值则在鼠标当前位置弹出

	inline HMENU GetMenu(){return m_hMenu;};
	inline HMENU GetPopup(){return m_hCurrMenu;};
	int GetItemIndex(UINT uIndex);
	int GetItemId(UINT uIndex);
	HMENU GetItem(UINT uIndex);

	virtual BOOL Insert(UINT uid,UINT nIndex,LPSTR szText,UINT flag = BY_COMMAND);
	virtual BOOL InsertSep(UINT nIndex,UINT uPos=BY_COMMAND);	//插入分隔符
	virtual BOOL Delete(UINT nIndex,UINT uPos=BY_COMMAND);

	virtual DWORD CheckItem(UINT uIndex,BOOL bChecked = TRUE,UINT uFlag = BY_COMMAND);
	virtual BOOL CheckRadioItem(UINT idFirst,UINT idEnd,UINT uIndex,UINT uFlag = BY_POSITION);
	void SetCheckBmp(UINT uIndex,UINT uFlag,HBITMAP hbmCheck,HBITMAP hbmUncheck = NULL);
	void EnableItem(UINT uIndex,BOOL bEnable = TRUE,UINT uFlag = BY_COMMAND);

	BOOL BindToWindow(HWND hWnd){return SetMenu(hWnd,m_hMenu);};
	void Update(HWND hWnd);

public:
	HMENU m_hMenu, m_hCurrMenu;		//m_hCurrMenu:如果是POPUPMENU,该值是m_hMenu的submenu,否则=m_hMenu
	HINSTANCE m_hInst;
};


#define FUNC_DRAWMENU_DEF	CNCoolMenu_DrawItem_def
#define FUNC_DRAWMENU_XP	CNCoolMenu_DrawItem_XP


class CNCoolMenu:public CNMenu
{
public:
	CNCoolMenu(HINSTANCE hInst);
	CNCoolMenu(HINSTANCE hInst, LPCTSTR lpMenuname);
	CNCoolMenu(HINSTANCE hInst, HMENU hMenu,BOOL bParent = TRUE);
	~CNCoolMenu();

	BOOL Load(LPCTSTR lpMenuname);
	BOOL Attach(HMENU hMenu);
	HMENU Detach();
	BOOL LoadPopup(LPCTSTR lpMenuname,UINT nIndex = 0);
	void Free();				//释放分配的菜单图象(背景,选中图案,版权栏等)

	BOOL Draw(LPDRAWITEMSTRUCT lps);
	BOOL MeasureItem(LPMEASUREITEMSTRUCT pmis);
	BOOL Remap();				//设置菜单(包括子菜单为自绘形式)
	void Reset();				//设置菜单为初始状态(不自绘,释放分配的菜单数据)

	HICON SetItemIcon(UINT nIndex,HICON hicon);		//设置菜单项图标(根据菜单项的ID)
	HBITMAP SetBkg(HBITMAP hbmBkg);
	void SetColor(COLORREF crBkg,COLORREF crHilight,COLORREF crBkgText = COLOR_TRANSPARENT,COLORREF crSelText = COLOR_TRANSPARENT);
	HBITMAP SetSelectBkg(HBITMAP hbmHilight,COLORREF crText = COLOR_TRANSPARENT);
	void SetSelectRectType(UINT uRectStyle);
	HBITMAP SetMarker(HBITMAP hbmMarker);			//设置版权条

	DWORD CheckItem(UINT uIndex,BOOL bChecked = TRUE,UINT uFlag = BY_COMMAND);
	BOOL CheckRadioItem(UINT idFirst,UINT idEnd,UINT uIndex,UINT uFlag = BY_POSITION);

	BOOL Insert(UINT uid,UINT nIndex,LPSTR szText,UINT flag = BY_COMMAND);
	BOOL InsertSep(UINT nIndex,UINT uPos=BY_COMMAND);//插入分隔符
	BOOL Delete(UINT nIndex,UINT uPos=BY_COMMAND);

	void SetItemDrawFunc(FUNC_COOLMENU_DRAWITEM drawer);	//设置菜单自绘函数
	CNCoolMenu* SubMenu(int i);							//得到子菜单

private:
	void Init();								//类初始化
	void InitSubMenu();							//初始化子菜单
	void ResetItemData();						//重置菜单项数据(用于增加菜单项菜单数据缓冲区已满的情况)
	BOOL SetCheckItem(UINT uIndex,int nType = MENUCHECK_CHECKBOX);

public:
	static HBITMAP m_hbmCheck,m_hbmRadio;		//默认菜单项选中图案
	static int m_cxFont,m_cyFont;
	int m_ItemIconPos;							//菜单项图标位置(与选中图案并列显示或优先显示)
	MENUGLOBALSTYLE m_Style;

private:
	static HFONT m_hFont;
	LPCNMENUSTYLE m_lprms;
	CNMENUSTYLE m_SepData;					//分隔线数据(公用的ItemData)
	FUNC_COOLMENU_DRAWITEM m_DrawItemFunc;
	static int m_id;
	int m_nSubMenuCnt;
	CNCoolMenu** m_SubMenu;
	CNCoolMenu* m_Popup;
	BOOL m_bInited;						//是否已初始化
	int m_nItemCnt;						//菜单项数(非实际数量,分配DATA用)
};
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -