弹出菜单一般通过鼠标位置,或者相对控件固定位置。鼠标位置相对简单不再多说。一般来说在SOUI里可以通过GetWindowRect来获取控件的相对窗口位置。通过转换为屏坐标。弹出菜单即可。位是有一个特例。在SOUI实现了一系列的view系列控件。而这个每一个项都是一个SItemPanel。而SItemPanel是自Root的.也就是说它的所有子控件都是相对它的偏移坐标而不是窗口的坐标。所以需要先计算一次偏移才能转化成正确的窗口坐标。以下为在某适配器处理代码如下:
bool OnUninstallApp(EventCmd* e)
{
SWindow* pWnd = sobj_cast<SWindow>(e->sender);
SASSERT(pWnd);
{
CRect rc = pWnd->GetWindowRect();//获取自己的坐标
SItemPanel* pItemPanel = (SItemPanel*)pWnd->GetTopLevelParent();//获取itempanel窗口
CRect rc2 = pItemPanel->GetItemRect();//获取itempanel的坐标
rc += rc2.TopLeft();//偏移控件坐标
POINT pt = { rc.left,rc.bottom };//此处老版本VS可能编译不过。自行修改
ClientToScreen(pWnd->GetContainer()->GetHostHwnd(),& pt);//转为屏坐标
//弹出菜单
SMenuEx menu;
menu.LoadMenu(_T("SMENU:menu_main"));
menu.TrackPopupMenu(0, pt.x, pt.y + 2, pWnd->GetContainer()->GetHostHwnd());
}
return true;
}