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

📄 popup_menu.h

📁 实时监控
💻 H
字号:
/*
 *	Purpose:	Generate a popup menu
 *	Module:		General
 *	Usage:		include this file

				...
 				popup_menu pm
				pm.add_item("item 0", 32771);
				pm.add_item("item 1", 32772);
				pm.add_item("item 2", 32773);
				pm.popup(this);	// "this" is a CWnd derived object

				// remove:
				pm.remove_by_index(0);		// remove the first item
				pm.remove_by_cmd(32772);	// remove the item with cmd 32772
				pm.remove_update();			// update the remove operation
				pm.popup(this);
				...

 *	Author:		nodman
 *	Copyright:	(C)2003 Senao Corp., Shenzhen
 *	History:	2003-6-11 created
				2003-8-28 added load_menu, nodman
 */

#ifndef _POPUP_MENU_H
#define _POPUP_MENU_H

#include "vector"	// for vector<...>
class popup_menu
{
	CMenu menu;
	std::vector<UINT> remove_cmd_list;
	
public:
	popup_menu(){create();}
	~popup_menu(){destroy();}
	
	void create()
	{
		menu.CreatePopupMenu();
	}
	void destroy()
	{
		menu.DestroyMenu();
	}
	
	// 删除一个菜单项, index: 要删除的项目<序号>
	// 注意: 完成所有项目删除后要调用remove_update()更新
	void remove_by_index(UINT index)
	{
		UINT cnt = menu.GetMenuItemCount();
		// 超出范围
		if( index >= cnt )
			return;
		
		UINT cmd = menu.GetMenuItemID(index);
//		if( cmd == 0 ||		// 该项是separator
//			cmd == -1 )		// 该项是popup menu
//			return;
		
		remove_cmd_list.push_back(cmd);
	}
	
	// 删除一个菜单项, cmd: 要删除的项目<命令值>
	// 注意: 完成所有项目删除后要调用remove_update()更新
	void remove_by_cmd(UINT cmd)
	{
		remove_cmd_list.push_back(cmd);
	}
	
	// 更新删除操作
	void remove_update()
	{
		for( int i=0; i<remove_cmd_list.size(); i++ )
		{
			menu.DeleteMenu(remove_cmd_list[i], MF_BYCOMMAND);
		}
		remove_cmd_list.clear();
	}
	
	// 添加一个菜单项
	// text: 菜单项文字, 如果text=NULL, 则添加一个separator
	// cmd: 菜单项命令值
	void add_item(LPCTSTR text, UINT cmd)
	{
		UINT flags = 0;
		if( text == NULL )
			flags |= MF_SEPARATOR;
		else
			flags |= MF_STRING;
		menu.AppendMenu(flags, cmd, text);
	}

	HMENU get_hmenu()
	{
		return menu.m_hMenu;
	}

	void enable_item(int index, bool enable=true)
	{
		UINT flag = MF_BYPOSITION;
		if( enable )
			flag |= MF_ENABLED;
		else
			flag |= MF_DISABLED | MF_GRAYED;
		menu.EnableMenuItem(index, flag);
	}

	void select_item(int index)
	{
		menu.CheckMenuItem(index, MF_CHECKED | MF_BYPOSITION);
	}
	
	bool is_sel(int index)
	{
		return MF_CHECKED == menu.GetMenuState(index, MF_BYPOSITION);
	}
	// 弹出菜单供选择
	// x,y: 菜单弹出左上角绝对坐标值, 如果x,y都为-1, 则用当前鼠标位置
	// 返回值: 用户选择的菜单项的命令值(即在add_item(..)中指定的cmd值)
	UINT popup(CWnd* owner, int x=-1, int y=-1)
	{
		if( x == -1 && y == -1 )
		{
			POINT pt;
			::GetCursorPos(&pt);
			x = pt.x;
			y = pt.y;
		}
		return menu.TrackPopupMenu( TPM_RETURNCMD | TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, owner);
	}

	static UINT popup(UINT idm, CWnd* owner)
	{
		CMenu tmp;
		if( !tmp.LoadMenu(idm) )
			return false;
		
		CMenu* m = tmp.GetSubMenu(0);
		CPoint pt;
		GetCursorPos(&pt);

		if( m )
		{
			return m->TrackPopupMenu( TPM_RETURNCMD | TPM_LEFTALIGN | TPM_RIGHTBUTTON, 
				pt.x, pt.y, owner );
		}
		return 0;
	}

	// 全部删光光
	void remove_all()
	{
		destroy();
		create();
	}
};

#endif	// _POPUP_MENU_H

⌨️ 快捷键说明

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