Прикрепление данных элемента к элементу меню
Это работа по созданию контекстного меню:
CMenu mnuContext;
CMenu *pMnuPopup, *pMnuSwap;
mnuContext.LoadMenu(IDR_MENU_MWB_SWAP);
pMnuPopup = mnuContext.GetSubMenu(0);
if (pMnuPopup != nullptr)
{
pMnuSwap = pMnuPopup->GetSubMenu(0);
if (pMnuSwap != nullptr)
{
CMenu *pMnuChairman = pMnuSwap->GetSubMenu(0);
if (pMnuChairman != nullptr)
pMnuChairman->DeleteMenu(0, MF_BYPOSITION);
//#TODO Init other pop up menus
int iChairman = -1; // Reset counters
for (int i = 0; i < m_cbDates.GetCount(); i++)
{
CString strDate, strMenuText;
m_cbDates.GetLBText(i, strDate);
CChristianLifeMinistryEntry *pEntry = static_cast<CChristianLifeMinistryEntry*>(m_cbDates.GetItemDataPtr(i));
if (pEntry->GetChairman() != _T("") && pMnuChairman != nullptr && i != m_iDateIndex)
{
iChairman++;
strMenuText = pEntry->GetChairman() + _T(" (") + strDate + _T(")");
pMnuChairman->InsertMenu(iChairman, MF_BYPOSITION, ID_SWAP_CHAIRMAN_ITEM + iChairman, strMenuText);
//# TODO Can I assign the pointer of pEntry? Or the "i" variable?
}
}
pMnuPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,
pMsg->pt.x, pMsg->pt.y, this, nullptr);
}
}
Как вы можете видеть, я создаю такой пункт меню:
pMnuChairman->InsertMenu(iChairman, MF_BYPOSITION, ID_SWAP_CHAIRMAN_ITEM + iChairman, strMenuText);
Могу ли я связать с этим пунктом меню переменную i
? Либо это, либо фактический указатель (pEntry
)?
1 ответ:
Непонятно, зачем нужно связывать пункт меню с переменной
i
. Я думаю, что вместо этого вам нужно обрабатывать сообщения при нажатии на пункт динамического меню. Для статического пункта меню вы бы использовали макросы ON_COMMAND и ON_UPDATE_COMMAND_UI в вашей карте сообщений.Что вы можете сделать в вашем случае, это использовать ON_COMMAND_RANGE в вашей карте сообщений, чтобы иметь один обработчик для диапазона пунктов меню:
BEGIN_MESSAGE_MAP(CYourView, CFormView) ON_COMMAND_RANGE(ID_SWAP_CHAIRMAN_ITEM, ID_SWAP_CHAIRMAN_ITEM + 100, OnChairmanClick) END_MESSAGE_MAP()
Ваша
OnChairmanClick
функция будет иметь такой синтаксис:void CYourView::OnChairmanClick(UINT nID)
Вам нужно будет запомнить UID элемента меню, который вы связали с председателем, например, в вашем
CChristianLifeMinistryEntry
Вы можете добавить для него элемент UID. Вы также можете создатьCMap<UID, CChristianLifeMinistryEntry, UID, CChristianLifeMinistryEntry>
, где вы бы хранили uid для более быстрого доступа.