我使用的是VC6.0。当我右键单击ListBox的项目时,我正在尝试编程以显示上下文菜单。但是现在popmenu可以在ListBox的rect中显示,因为我只能得到ListBox的矩形,而且我不知道如何得到项目的矩形。我知道有一个宏ListView_GetSubItemRect
似乎得到了ListView项目的矩形。对于ListBox有没有类似的方法,或者有没有办法获得ListBox的项目的宽度和高度,所以我可以计算矩形?我没有在msdn和google上找到一些有用的信息?谁能给我一些想法?感谢。
我目前的代码:
void My_OnContextMenu(HWND hwnd, HWND hwndContext, UINT xPos, UINT yPos)
{
HWND hList = GetDlgItem(hwnd,IDC_LIST_RESTYPE);
if (hList == hwndContext)
{
if(-1!=indexLB)
{
RECT rect;
POINT pt;
GetClientRect(hwndContext, &rect);
ScreenToClient(hwndContext, &pt);
if(PtInRect(&rect, pt))
{
HMENU hroot = LoadMenu((HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDR_MENU_DELTYPE));
if(hroot)
{
HMENU hpop = GetSubMenu(hroot,0);
ClientToScreen(hwndContext, &pt);
TrackPopupMenu(hpop, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwndContext, NULL);
DestroyMenu(hroot);
}
}
}
}
}
修改
电流:的
首先,我左键单击一个项目以选择一个项目。然后我右键单击所选项目以显示popmenu。它正常显示。但是在第二步中如果单击ListBox的空白区域,它也会显示菜单。这不是我的预期。
我的期望是:
菜单仅在我单击项目时显示,并且仅显示在项目上方的位置。当我右键点击其他区域时,它不会被显示出来。
答案 0 :(得分:2)
您正在寻找ListBox_GetItemRect
宏。
但是,我确实觉得用户会发现在一个地方点击很奇怪,看到菜单出现在其他地方。
答案 1 :(得分:0)
此问题的正确解决方法是在鼠标位置弹出上下文菜单。点击一个地方并将其弹出其他地方会非常糟糕。
要使用GetCursorPos()
来获取鼠标位置。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms648390%28v=vs.85%29.aspx
要清楚,首先使用ListBox_GetItemRect来确定单击哪个项目,如果没有则忽略它。然后使用GetCursorPos,使菜单显示鼠标所在的位置 - 列表项内部 - 而不是几个像素之外的某个地方。 Windows UI标准是上下文菜单出现在光标位置。
答案 2 :(得分:0)
我不确定你为什么编写自己的OnContextMenu - 你应该使用类向导将WM_CONTEXTMENU映射到标准处理程序,其中现有函数在你的代码中结束,如下所示:
//Wizard Added this the message map block
ON_WM_CONTEXTMENU()
//Declares the function with the proper parameters
void MyDlg::OnContextMenu(CWnd* pWnd, CPoint point);
//in the body of OnContextMenu use the system supplied parameters and the
//menu will appear next to the mouse position wherever it is clicked in the control
CMenu popupmenu;
popupmenu.LoadMenu(IDR_RMOUSEPOPUP);
int Command = (int)popupmenu.GetSubMenu(0)->TrackPopupMenu(
TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_NONOTIFY,
point.x, point.y, pWnd);