これは非常に基本的な質問かもしれませんが、初心者はその理由を理解していないので、基本的にツリー コントロールのポップアップ メニューが必要です。ツリー コントロールの右クリックで 1 つのメニューがポップアップし、このメニューの基本で他の機能が続行します。そのために。私は次のコードを使用しました、
.h ファイルで、
#define NEW_RELAY_MENU_START WM_USER + 1
#define NEW_RELAY_MENU_END WM_USER + 256
.cpp ファイルで
BEGIN_MESSAGE_MAP(CCtrlModDefDlgTree, CTreeCtrl)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelChangedTreeCtrl)
ON_NOTIFY_REFLECT(NM_RCLICK, &CCtrlModDefDlgTree::OnNMRClick)
ON_COMMAND_RANGE(NEW_RELAY_MENU_START,NEW_RELAY_MENU_END,CCtrlModDefDlgTree::OnNewMenu)
END_MESSAGE_MAP()
CCtrlModDefDlgTree::CCtrlModDefDlgTree()
{
NumberOfRelays.RemoveAll();
NumberOfRelays.Add(L"MENU1");
NumberOfRelays.Add(L"MENU2");
NumberOfRelays.Add(L"MENU3");
NumberOfRelays.Add(L"MENU4");
NumberOfRelays.Add(L"MENU5);
NumberOfRelays.Add(L"MENU6");
}
void CCtrlModDefDlgTree::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
/* Get the cursor position for this message */
DWORD dwPos = GetMessagePos();
/* Convert the co-ords into a CPoint structure */
CPoint pt( GET_X_LPARAM( dwPos ), GET_Y_LPARAM ( dwPos ) );
CPoint spt;
spt = pt;
/* convert to screen co-ords for the hittesting to work */
ScreenToClient( &spt );
UINT test;
HTREEITEM hti = HitTest( spt, &test );
if ( hti != NULL )
{
/* Is the click atcually *on* the item? */
if ( test & TVHT_ONITEM )
{
/* Do the normal context menu stuff */
ShowPopupMenu( pt );
}
}
*pResult = 0;
}
void CCtrlModDefDlgTree::ShowPopupMenu( CPoint& point )
{
if (point.x == -1 && point.y == -1)
{
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
//create a menu object for main menu
CMenu *menu = new CMenu();
menu->CreatePopupMenu();
//another menu object for submenu
CMenu *subMenu = new CMenu();
subMenu->CreatePopupMenu();
for(int __index = 0;__index<NumberOfRelays.GetCount();__index++)
{
subMenu->AppendMenu(MF_STRING, NEW_RELAY_MENU_START+__index, NumberOfRelays.ElementAt(__index));
}
//append submenu to menu
menu->AppendMenu(MF_POPUP|MF_STRING, (UINT)subMenu->m_hMenu, _T("New Menu") );
ASSERT(menu != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
menu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
void CCtrlModDefDlgTree::OnNewMenu(UINT nID)
{
}
しかし、メニューのクリック時に OnNewMenu() 関数が呼び出されません。すべてのメニューがデフォルトで有効になっています。何が間違っていますか?