用GetSystemMenu得到的系统菜单只能使用下面三个函数,以下是MSDN的原话:
The pointer returned by the GetSystemMenu member function can be used with the
CMenu::AppendMenu, CMenu::InsertMenu, or CMenu::ModifyMenu functions to change the Control menu.
我真是不明白,返回的是CMenu指针,为什么不能使用CMenu的其它函数呢?
如果我想要删除掉系统菜单中的“移动”项,应该怎么办,我看了CMenu::ModifyMenu的说明半天,也没搞懂怎么删除菜单项。

解决方案 »

  1.   

    呵呵,是什么工程?Dialog的还是SDI还是MDI?
    如果是MDI的可以:
    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    //if( !CMDIFrameWnd::PreCreateWindow(cs) )
    //return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    cs.style =  WS_POPUP | WS_OVERLAPPED | WS_VISIBLE |WS_DLGFRAME;
    if(cs.hMenu!=NULL) 
    {
    ::DestroyMenu(cs.hMenu);   // 如果菜单已经载入,则删除掉
    cs.hMenu = NULL;           // 设置窗口菜单为NULL }
    return CMDIFrameWnd::PreCreateWindow(cs);
    }
      

  2.   

    如果是Dialog工程,你可以处理Dialog类的WM_INITMENU消息的处理函数中修改系统菜单!!!
      

  3.   

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
      ModifyStyle(WS_MINIMIZEBOX, 0);
    }
      

  4.   

    第一个回答是去处所有菜单的,针对MDI和SDI的。
    如果是Dialog工程想修该系统菜单,可以使用ClassWizard中的Class Info标签页,将其中的Message filter从原来的Dialog改为Window就可以映射WM_INITMENU消息了,呵呵
      

  5.   

    我是在对话框中用,对于vcleaner(我没做大哥已经很久了.......) 所说,我有以下几个问题:一:WM_INITMENU消息在每次弹出菜的时候都要发送,那么如果响应这个消息来删除某个菜单项,必需要判断该菜单项是否存在,要命的是只有第一次存在,以后均不存在,这个算法是不是太粗糙了呢?二:系统菜单的增减是不是应该在对话框初始化函数里完成,举个例子,每个对话程序都会在初始化函数里添加“关于”菜单项(因为关于菜单项在每个工程中都不同,不像最大化、最小化等,他们在每个工程中是相同的),而没有响应WM_INITMENU消息来增加。
      

  6.   

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    cs.style =  WS_POPUP | WS_OVERLAPPED | WS_VISIBLE |WS_DLGFRAME;
    if(cs.hMenu!=NULL) 
    {
    ::DestroyMenu(cs.hMenu);   // 除掉已经载入的菜单
    cs.hMenu = NULL;           // 设置窗口菜单句柄为NULL }
    return CMDIFrameWnd::PreCreateWindow(cs);
    }
      

  7.   

    对话框程序会调用PreCreateWindow吗?我只想删除某一项菜单。