Как создать контекстное меню в элементе управления списком?

(IDE: Visual C ++ 6.0)

Я хочу использовать элемент управления списком для создания такой программы, как диспетчер задач Windows.

Он добавляет информацию (элемент) процесса, полученную через API, и отображает ее через список управления.

Что я хочу сделать, так это щелкнуть правой кнопкой мыши по конкретному элементу, и диалоговое окно появится как настоящий менеджер задач.

В результате поиска, похоже, используется функция OnContextMenu (CWnd *, CPoint), но она не понимает, как она работает.

Я бы хотел, чтобы вы привели простой пример.

Спасибо 🙂

0

Решение

Это рабочий образец, извлеченный из моего проекта.
Обратите внимание, что этот код работает на VS’15 и скорее всего также на VS’10. У меня нет версии 1998 года … прошло уже 20 лет.

Я оставил некоторые комментарии в коде. Пожалуйста, ознакомьтесь с этим.

CMenu m_Menu; //Class member

m_Menu.CreateMenu(); //Call this once only (I do it in PreSubclassWindow)

//class CMenuListCtrl : public CListCtrl
void CMenuListCtrl::OnContextMenu(CWnd *pWnd, CPoint ptMousePos)
{
//Some people might use a keyboard and not the mouse
if (ptMousePos.x == -1 && ptMousePos.y == -1)
{
auto nSelectedItem = GetSelectionMark(); //Get the selected item in the CListCtrl
if (nSelectedItem == -1)
return;

//Find the position
CRect itemRect;
GetItemRect(nSelectedItem, &itemRect, LVIR_BOUNDS);
ClientToScreen(&itemRect);
ptMousePos.x = itemRect.left + (itemRect.Width() / 10); //Some offset to display the menu user-friendly
ptMousePos.y = itemRect.top + itemRect.Height() / 2;
}

CPoint hitPoint = ptMousePos;
ScreenToClient(&hitPoint);

//Fix header pop-up bug
CHeaderCtrl *pHeader = GetHeaderCtrl();
HDHITTESTINFO hitTestHeader = {0};
hitTestHeader.pt = hitPoint;

//The header doesn't need a context-menu, the item does
if (pHeader->HitTest(&hitTestHeader) != -1)
return;

UINT uFlags = 0;
HitTest(hitPoint, &uFlags);
if (uFlags & LVHT_NOWHERE)
return;

//Get the previously created menu
CMenu *pPopUp = nullptr;
pPopUp = m_Menu.GetSubMenu(0);

if (pPopUp)
pPopUp->TrackPopupMenu(TPM_LEFTALIGN, ptMousePos.x, ptMousePos.y, this);
}

Для того, чтобы отобразить меню, вы должны сначала создать его.

CMenu submenu;
submenu.CreatePopupMenu();
submenu.AppendMenuW(MF_STRING, IDC_COPY_POPUP,          L"&Copy");
submenu.AppendMenuW(MF_SEPARATOR);
submenu.AppendMenuW(MF_STRING, IDC_DELETE_POPUP,        L"&Delete");
m_Menu.AppendMenuW(MF_POPUP, reinterpret_cast<UINT_PTR>(submenu.m_hMenu), L"");

submenu.Detach();
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]