右键菜单的创建总结

本文详细介绍了在应用程序中创建右键菜单的过程。包括定义菜单项结构体、菜单对象的声明与初始化、创建及加载菜单的具体步骤。适用于希望了解菜单创建细节的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

右键菜单的创建总结本文介绍Pop-up的创建,右键菜单在应用软件中可以说是使用极其频繁的一种技术.结合实际项目,做以下总结; 1.定义菜单项结构体:

#pragma pack(push, 1) struct stMenuItem { int iMenuID ; //资源ID char szItem[30] ; //菜单项显示文本 } ; #pragma pack(pop)2.在要使用Pop-up Menu的文件前定义变量: //PerfTreeView.cpp
stMenuItem MenuItemInsertPerf[] = 

{

	{IDM_INSERT_ALLPERF, "增加性能"},

	{IDM_END,         ""}

};
3.在PerfTreeView.h定义CMenu对象:
 CMenu *m_pRightMenu;



//初始化:

CPerfTreeView::CPerfTreeView()

: m_pRightMenu(NULL)

{



}

在析构函数中销毁

CPerfTreeView::~CPerfTreeView()

{

	if(m_pRightMenu != NULL)

	{

		m_pRightMenu->DestroyMenu();

		delete m_pRightMenu;

		m_pRightMenu = NULL;

	}

}



4.创建菜单的函数:

/*********************************************************************

* 函数名称:void SetRightMenu()

* 说明:创建Pop-Up Menu

* 入口参数:

* 空

* 返回值:

* void  -- 

* 作者: Duanyx

* 时间 : 2008-03-24 13:23:30

*********************************************************************/

void CPerfTreeView::SetRightMenu()

{

	if(m_pRightMenu == NULL)

	{

		m_pRightMenu = new CMenu();

		m_pRightMenu->CreatePopupMenu();

	}

		

	int iNum, i;

	stMenuItem *pItem = MenuItemInsertPerf;

	

	iNum = m_pRightMenu->GetMenuItemCount();

	

	for(i = iNum - 1; i >= 0; i--)

	{

		m_pRightMenu->RemoveMenu(i, MF_BYPOSITION);

	}

	

	while (pItem->iMenuID != IDM_END)

	{

		if(pItem->iMenuID > 0)

		{

			m_pRightMenu->InsertMenu(-1, MF_BYCOMMAND, pItem->iMenuID, pItem->szItem);

		}

		else

		{

			m_pRightMenu->InsertMenu(-1, MF_SEPARATOR);

		}

		pItem++;

	}	

}



5.在右键消息中加载此菜单:

/*********************************************************************

* 函数名称:void OnRButtonDown(UINT nFlags, CPoint point)

* 说明:右键消息响应中加载菜单

* 入口参数:

* UINT nFlags

* CPoint point

* 返回值:

* void  -- 

* 作者: Duanyx

* 时间 : 2008-03-24 14:03:30

*********************************************************************/

void CPerfTreeView::OnRButtonDown(UINT nFlags, CPoint point) 

{

//	CTreeView::OnRButtonDown(nFlags, point);

	CTreeCtrl &treeCtrl = GetTreeCtrl();



	UINT nFlag;

	CPoint cp;

	GetCursorPos(&cp);	



	treeCtrl.ScreenToClient(&cp);

	HTREEITEM hSel  = treeCtrl.HitTest(cp, &nFlag);

	m_hPerfItemSel = hSel;

	

	treeCtrl.ClientToScreen(&cp);

	//右键单击时选中结点.

	if(hSel && (nFlag & (TVHT_ONITEMLABEL | TVHT_ONITEMICON)) != 0)

	{

		//选择此结点并使用删除菜单有效

              //TreeCtrl默认右键不能选定结点,所以做此处理实现右键单击选定

		treeCtrl.SelectItem(hSel);

	    //使菜删除菜单失效

	    m_pRightMenu->EnableMenuItem(IDM_DELETE_DEFAULTPEF, MF_GRAYED);

		

	}

	else

	{

		//当前没有选择结点,使菜删除菜单失效

		m_pRightMenu->EnableMenuItem(IDM_DELETE_DEFAULTPEF, MF_GRAYED);

	}

       //弹出菜单

	m_pRightMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, cp.x, cp.y, this) ;



}



6.当然也可用LoadMenu方法加载显式创建的菜单,个人觉得如果一个系统中要使用很多CMenu的话,这样做不是一个值得提倡的方法.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值