如何在MFC的列表框中添加上下文菜单?我没有在列表框的属性中看到任何WM_CONTEXTMENU处理程序。有什么想法吗?
编辑:我按照本教程MFC List Control: How to use a context menu in a list control?进行了操作。教程说从CListBox派生我自己的类,但是现在如何将我派生类的列表框添加到对话框中?
答案 0 :(得分:4)
在父类中放置一个OnContextMenu处理程序。然后添加一个弹出菜单
编辑要添加OnContextMenu处理程序,请将事件处理程序添加到PARENT窗口(即不是列表类)。这最容易通过资源编辑器完成。转到属性页面,然后转到消息部分。然后为WM_CONTEXTMENU添加一个函数。
void CYourDialog::OnContextMenu(CWnd* pWnd, CPoint point)
{
CListCtrl* pList = (CListCtrl*)GetDlgItem( ID_YOUR_LIST );
if ( (CWnd*)pList == pWnd )
{
CMenu menu;
// Create your menu items.
int retVal = menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, this );
// Handle your returns here.
}
}
答案 1 :(得分:2)
由于我的编辑因“改变太多”的理由被拒绝,我会在此提出我的建议,因为在我看来,原始代码会促进不良的编码实践。
void CYourDialog::OnContextMenu(CWnd* pWnd, CPoint point)
{
int CtrlID = pWnd->GetDlgCtrlID();
if (CtrlID == ID_YOUR_LIST) {
CMenu menu;
// Create your menu items...
int retVal = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, this);
// Handle selected options here...
}
}
答案 2 :(得分:1)
您需要执行以下步骤:
添加
ON_WM_CONTEXTMENU()
到
BEGIN_MESSAGE_MAP()
所以你会有类似的东西
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_QUERYDRAGICON()
ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()
:
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point)
然后按照文章中的建议添加“上下文菜单”功能:
void CMyDialog :: OnContextMenu(CWnd * pWnd,CPoint点) { CListCtrl * pList =(CListCtrl *)GetDlgItem(ID_YOUR_LIST);
if ( (CWnd*)pList == pWnd )
{
CMenu menu;
// Create your menu items.
int retVal = menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, this );
// Handle your returns here.
}
}
答案 3 :(得分:0)
为对话框窗口添加处理程序。这将产生这个:
void YourDialogClass::OnContextMenu(CWnd* pWnd, CPoint point) {
...
}
pWnd
将指向用户右键单击鼠标的窗口/控件。
答案 4 :(得分:0)
如果您按照教程派生自己的类,请确保将ON_WM_CONTEXTMENU()
添加到新的类消息映射中。
要添加派生类的列表框,只需为ListBox控件添加一个变量,并将变量类指定为派生类。
但是我认为@Goz的答案也是一个有效的解决方案,而且更简单。