BOOL CMyDlg::OnInitDialog()
{
         .....
         CRect rect;
GetClientRect(rect); if(!m_ToolBar.Create(this))
{
TRACE("failed to create tool bar");
return -1;
}
m_ToolBar.LoadToolBar(IDR_TOOLBAR1);
m_ToolBar.MoveWindow(0,0,rect.right,32); CMenu menu;
menu.LoadMenu(IDR_TEST);
CMenu* pMenu=menu.GetSubMenu(0); this->ClientToScreen(rect);
pMenu->TrackPopupMenu(TPM_LEFTALIGN,rect.left,rect.top,this);
         ...
}
为什么菜单不是显示在对话框中,而是在整个屏幕上???求解

解决方案 »

  1.   

    OnInitDialog函数中窗口虽然已经创建,但还没有显示出来,它得到的窗口区域是基于(0,0)点的,你Debug下调试可以看到rect的left和top都是0,但是对话框的宽度和高度是正确的。你可以PostMessage一个自定义的消息,然后在消息响应函数中加入你TrackPopupMenu的代码。
      

  2.   

    不懂0_0我的菜单都是直接在对话框里的Menu里面关联的
      

  3.   

    建议首先弄明白几个必要的参数
    MoveWindow(坐标)// 此处是谁Move到谁(坐标系统)的什么位置?
    TrackPopupMenu(坐标,this);// 此处的坐标是相对于谁的坐标?this指的是由谁来响应菜单事件?然后明白了,再 ScreenToClient/ClienToScreen,注意调用者是谁。
      

  4.   

    this->ClientToScreen(rect);改成this->GetClientRect(rect);试一下看
      

  5.   

    不要在OnInitDialog()响应弹出菜单啊,那时窗口界面还没显示出来,你GetRect是得不到正确值的,一般弹出菜单都是在右键单击!!