listbox实现右键点击弹出菜单

v_023 2008-08-05 05:10:14
如何实现在控件list control 里面增加一个右键点击弹出菜单,菜单内容为修改和删除,并且右键所点击的是由数据库里面读出的一条记录,对该记录进行修改和删除,附加再问下,该如何实现传值
...全文
470 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
socrates 2008-08-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ycoder 的回复:]
你是想知道右键点在list的哪一行么?相应NM_RCLICK消息
C/C++ codeCPoint ptCurr;
GetCursorPos(&ptCurr);
m_list.ScreenToClient(&ptCurr);intnItemIndex=m_list.HitTest(ptCurr);
如果是选择多行就GetFirstSelectedItemPosition,GetNextSelectedItem。
[/Quote]



CXXX.h
CMenu *m_pRightMenu

CXXX.cpp

构造函数中:
m_pRigthMenu = NULL

析构函数中
if(m_pRightMenu != NULL)
{
m_pRightMenu->DestroyMenu();
delete m_pRightMenu;
m_pRightMenu = NULL;
}

/*
结构体stMenuItem的定义为:
#pragma pack(push, 1)
struct stMenuItem
{
int iMenuID ;
char szItem[30] ;
} ;
#pragma pack(pop)

*/
//设置菜单,可在初始化函数中调用
void CXXX::SetRightMenu()
{
stMenuItem MenuItemErrKbase[] =
{
{IDM_ADD_ERRKBASE, "添加记录"},
{IDM_UPDATE_ERRKBASE, "修改记录"},
{IDM_DELETE_ERRKBASE, "删除记录"},
{IDM_END, ""}
};



if(m_pRightMenu == NULL)
{
m_pRightMenu = new CMenu();
m_pRightMenu->CreatePopupMenu();
}

int iNum, i;
stMenuItem *pItem = MenuItemErrKbase;

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++;
}

}



//弹出
void XXX::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
CPoint ptCurr;
GetCursorPos(&ptCurr);
m_list.ScreenToClient(&ptCurr);
int nItemIndex=m_list.HitTest(ptCurr);

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

*pResult = 0;

}
caimps 2008-08-05
  • 打赏
  • 举报
回复
响应NM_RCLICK消息
用HitTest判断位置
cnzdgs 2008-08-05
  • 打赏
  • 举报
回复
如果鼠标点在了Item上,NM_RCLICK通知会传递一个NMITEMACTIVATE结构,结构中给出了被点击的Item和SubItem的索引值。
v_023 2008-08-05
  • 打赏
  • 举报
回复
哎,是啊,书本看的少,推荐本书下
v_023 2008-08-05
  • 打赏
  • 举报
回复
比如传每一条记录的id值,在点击修改时弹出对话框显示该记录的具体内容
ycoder 2008-08-05
  • 打赏
  • 举报
回复
你是想知道右键点在list的哪一行么?相应NM_RCLICK消息
CPoint ptCurr;
GetCursorPos(&ptCurr);
m_list.ScreenToClient(&ptCurr);
int nItemIndex = m_list.HitTest(ptCurr);

如果是选择多行就GetFirstSelectedItemPosition,GetNextSelectedItem。
Tolirry 2008-08-05
  • 打赏
  • 举报
回复
好好学习天天向上!多看看书吧年轻人!!!

响应List的NM_RCLICK消息,然后使用 CMenu::TrackPupupMenu() 弹出菜单


在菜单响应函数中添加类似下面的代码
CListCtrl* pList = static_cast<CListCtrl*>(GetDlgItem(IDC_LIST_DATASOURCE));
int nSel = pList->GetNextItem(-1, LVNI_SELECTED);
if (nSel != -1)
{
CAddDSDlg dlgModify(CAddDSDlg::TYPE_MODIFY);
dlgModify.m_csDSName = pList->GetItemText(nSel, COLUMN_NAME);
dlgModify.m_csDSIP = pList->GetItemText(nSel, COLUMN_IP);
dlgModify.m_csDSPort = pList->GetItemText(nSel, COLUMN_PORT);
CString csText = pList->GetItemText(nSel, COLUMN_TYPE);
TypeStringToArray(&dlgModify.m_csDSTypeArray, csText);
if (IDOK == dlgModify.DoModal())
{
pList->SetItemText(nSel, COLUMN_NAME, dlgModify.m_csDSName);
pList->SetItemText(nSel, COLUMN_IP, dlgModify.m_csDSIP);
pList->SetItemText(nSel, COLUMN_PORT, dlgModify.m_csDSPort);

LPCTSTR lpszText = NULL;
lpszText = TypeArrayToString(&dlgModify.m_csDSTypeArray, &csText);
pList->SetItemText(nSel, COLUMN_TYPE, lpszText);
}
}
cnzdgs 2008-08-05
  • 打赏
  • 举报
回复
要传什么值?
cnzdgs 2008-08-05
  • 打赏
  • 举报
回复
初始化的时候LoadMenu、GetSubMenu;响应NM_RCLICK通知,TrackPopupMenu。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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