vs2012 ListControl怎样响应右键,弹出菜单

编程小小鸟 2015-11-10 07:09:09
在vs2012,MFC中,鼠标右击ListControl控件的某一行,弹出菜单,已经为控件添加NM_RCLICK响应消息,网上找了关于响应右键弹出菜单的代码,但都不行,到底怎么写谁可以告诉我啊
...全文
353 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2015-11-11
  • 打赏
  • 举报
回复
添加NM_RCLICK响应消息,同时把要显示的菜单加到资源 消息中代码如下:

void Cxxxx::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	DWORD dwPos = GetMessagePos();
	CPoint Point(LOWORD(dwPos), HIWORD(dwPos));
	CMenu Menu;
	Menu.LoadMenu(IDR_MENU1);  //你要弹的菜单ID
	CMenu* Popup = Menu.GetSubMenu(0);
	ASSERT(Popup != NULL);
	if(-1 == pNMItemActivate->iItem)
	{
		Popup->EnableMenuItem(0, MF_BYPOSITION | MF_GRAYED);
		Popup->EnableMenuItem(2, MF_BYPOSITION | MF_GRAYED);
	}
	CListCtrlEx* list = dynamic_cast<CListCtrlEx*>(GetDlgItem(pNMItemActivate->hdr.idFrom));
	Popup->TrackPopupMenu(TPM_CENTERALIGN | TPM_RIGHTBUTTON, Point.x, Point.y, this);
	Popup->Detach();
	*pResult = 0;
}

zhouxiaofeng1021 2015-11-11
  • 打赏
  • 举报
回复
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); // 右键处理 void CTestInfoView::OnContextMenu(CWnd* pWnd, CPoint point) { TRACE_FUNCTION_DEBUG CMFCListCtrl* pWndList = (CMFCListCtrl*)&m_wndInfoList; ASSERT_VALID(pWndList); // 检查是否列表框,非列表框不响应 if (pWnd != pWndList) { CDockablePane::OnContextMenu(pWnd, point); return; } // 获取当前选中行,未选中行则不响应 if (point != CPoint(-1, -1)) { // 选择已单击的项: CPoint ptList = point; pWndList->ScreenToClient(&ptList); UINT uFlags = 0; int nItem = pWndList->HitTest(ptList, &uFlags); if (nItem >= 0) { // 显示右键菜单 CMenu menu; menu.LoadMenu(IDR_POPUP_TESTINFO); CMenu* pSumMenu = menu.GetSubMenu(0); if (AfxGetMainWnd()->IsKindOf(RUNTIME_CLASS(CFrameWndEx))) { CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu; if (!pPopupMenu->Create(this, point.x, point.y, (HMENU)pSumMenu->m_hMenu, FALSE, TRUE)) return; ((CFrameWndEx*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu); UpdateDialogControls(this, FALSE); } } } pWndList->SetFocus(); }我的项目中使用的方法
笨笨仔 2015-11-11
  • 打赏
  • 举报
回复
我使用自定义类,其中处理右键。如


class CMyListCtrl : public CMFCListCtrl
{
……

public:
	afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

//=============  右键菜单操作  ===============
void CMyListCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
	CPoint oPoint;														//定义一个用于确定光标位置的位置   
	GetCursorPos(&oPoint);												//获取当前光标的位置,以便使得菜单可以跟随光标
	CMenu menu,*pSubMenu;												//定义下面要用到的cmenu对象   
    menu.LoadMenu(IDR_MY_POPUP);										//装载自定义的右键菜单   
    pSubMenu=menu.GetSubMenu(0);										//获取第一个弹出菜单,所以第一个菜单必须有子菜单   
	// 设置右键菜单工作状态
	SetRightMenu(pSubMenu);
	//在指定位置显示弹出菜单 
    pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this);
	return;

	CMFCListCtrl::OnRButtonDown(nFlags, point);
}
编程小小鸟 2015-11-11
  • 打赏
  • 举报
回复
非常感谢你们的支持,问题解决啦,
mfmfmmf1 2015-11-11
  • 打赏
  • 举报
回复
实在不行,在主界面上响应RBUTTONDOWN 多加一个点在区域的判定
pipi20151001 2015-11-10
  • 打赏
  • 举报
回复
请参考:http://bbs.csdn.net/topics/70465397

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧