我在做菜单自绘时框架菜单,弹出菜单等都自绘成功了,但发现一个问题,就是在窗口最小化的情况下,在任务的程序标题上点右键,弹出的“关闭”,“还原”,“最小化”,“最大化”这些系统菜单也都被自绘了,(但是这里的自绘有些难看)在OnInitMenuPopup函数中有个参数bSysMenu表示当前菜单是否是系统菜单,但是OnInitMenu函数中没有这个参数,我如何识别当前是系统菜单而不给它加上自绘标志呢?

解决方案 »

  1.   

    http://topic.csdn.net/t/20050714/10/4143553.html
      

  2.   

    else if (nItemID >= 0xF000 && nItemID < 0xF1F0) // max of 31 SC_s {
    // special strings table entries for system commands
    m_nIDTracking = ID_COMMAND_FROM_SC(nItemID);
    ASSERT(m_nIDTracking >= AFX_IDS_SCFIRST &&
    m_nIDTracking < AFX_IDS_SCFIRST + 31);
    }系统菜单ID范围,摘自CFrameWnd::OnMenuSelect
      

  3.   

    这个不行的,我试过了,都不行。GetSystemMenu 参数无论TRUE FALSE 都不行, 获取的CMenu 指针不一样,指针里的m_hMenu句柄也不一样。
      

  4.   

    敢问楼主是怎么个自绘法,是在OnDrawItem?或者是hook绘制?如果是前者,那至少菜单要有自绘风格,可以从这里下手,如果是后者
    ,SetMenuInfo给非系统菜单设置一个标志,然后hook得到的菜单里GetMenuInfo判断即可
      

  5.   

    是前者,就是在OnInitMenu里给菜单加自绘标志的,问题是如何识别是系统菜单 ?
      

  6.   

    最简单的:重载CMainFrame的OnInitMenu函数,程序最小化时,在任务的程序标题上点右键,弹出系统菜单,这时也会进入OnInitMenu函数,也有对应的菜单项,就是系统菜单项,这时给他们加上自绘标志,他们在绘制时就会进入OnDrawItem函数,现在我就是想要在弹出系统菜单时能够识别出他是系统菜单从而不给他加自绘标志,因为不想自绘系统菜单。
      

  7.   

    getsystemmenu获取的句柄进行比较
      

  8.   

    我自己已经解决了。说出来给有需要的人:
    用GetMenuBarInfo函数,在OnInitMenu函数中处理: //先判断是否系统菜单
    MENUBARINFO mi;
    memset( &mi,0,sizeof(MENUBARINFO) );
    mi.cbSize = sizeof(MENUBARINFO);
    GetMenuBarInfo( pWnd->GetSafeHwnd(),OBJID_SYSMENU,0,&mi );
    if( mi.hMenu == pMenu->GetSafeHmenu() )
    return;