思路: 继承CListBox后,重载  OnRButtonDown(这个函数, 结果发现不会去响应 菜单菜单: 删除、其他功能就这两个子菜单郁闷呢
以下是OnRButtonDown函数,没有问题,
void CVTSListBox::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 POINT curpoint;
GetCursorPos(&curpoint);
ScreenToClient(&curpoint); RECT test;
int i = 0; while(i<= GetCount())
{
GetItemRect(i, &test); if (curpoint.y < test.bottom)
{
// 将当前右击项选中
SetCurSel(i); // 加载弹出菜单
CMenu temp,*ptr;
temp.LoadMenu(IDR_LISTBOX_MENU);
ptr = temp.GetSubMenu(0);
ClientToScreen(&point);
ptr->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,GetParent()); break;
}
else
// 若之前选中了某项,而现在的右击又没有击中选项,则取消之前的选项
SetCurSel(-1); i++;
} CListBox::OnRButtonDown(nFlags, point);
}
void CVTSListBox::OnListboxDelete()
{
// TODO: 在此添加命令处理程序代码 if( IDOK==MessageBox(_T("删除功能"),"操作提示",MB_OKCANCEL))
{ //删除操作................ return;
}
}

有颜色的部分,不会被调用。是不是这样理解: 由对话框来响应 删除菜单
或者是 CView ,CMainFrame来响应 删除菜单 ???
另外问个问题:对于非模式对话框 ,在这个非模式对话框中 动态创建了个 Button,那么正确销毁Button是该如何销毁??还是只要管销毁非模式对话框即可, Button不要管???

解决方案 »

  1.   

    ptr->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,GetParent());
    -------------------
    你的TrackPopuMenu中指定的是GetParent(),那么你必须到CListBox的父窗口类中处理菜单点击。你将GetParent()换成this就可以在你CListBox的派生类中处理了
      

  2.   

    另外问个问题:对于非模式对话框 ,在这个非模式对话框中 动态创建了个 Button,那么正确销毁Button是该如何销毁??还是只要管销毁非模式对话框即可, Button不要管??? 
     
     
    你怎么动态创建的?new CButton?
      

  3.   

    对, 就是new Button的方式 !!