1》重载 virtual BOOL PreTranslateMessage(MSG* pMsg);
2》实现方法
BOOL CIconWidget::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(WM_RBUTTONUP ==pMsg->message)
{
CPoint pt ;
CRect rtClient;
m_wndListBox.GetClientRect(&rtClient);
m_wndListBox.ClientToScreen(&rtClient);
INT iScrollPos= m_wndListBox.GetScrollPos(SB_VERT);
GetCursorPos(&pt);
int iSelect = (pt.y -rtClient.top+iScrollPos*ITEM_HEIGHT)/ITEM_HEIGHT;
m_wndListBox.SetCurSel(iSelect);
m_wndListBox.RedrawWindow();
if(rtClient.PtInRect(pt))
{
CMenu MyMenu;
MyMenu.LoadMenu(IDR_MENU_RIGHT);
MyMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this,NULL);
MyMenu.Detach();
}
}
return __super::PreTranslateMessage(pMsg);
}
注意创建这个menu的时候一定要保证一级目录是有值的。
以下给出如何创建这个menu:
双击xxx.rc
选择Menu然后右键点击添加资源,默认选择在Menu上按确定
在新出的界面中先填入第一行内容,这个可以任意,因为我们在使用的时候是MyMenu.GetSubMenu(0)->。
在这个编辑界面点右键会有两个东西经常使用:
一个是”以弹出方式查看”,这个是把这个菜单当做右键弹出菜单来处理,很直观,但是一定要保证在没勾选这个选项的情况下最上层是有值的,因为如果刚进来就选择了这个,那第一行是看不见的,无法确认的。就会导致menu加载失败或者显示有问题。
另一个就是“添加事件处理”。这个点击后请选择需要处理这些事件的类,很重要。