我的想法是:
CMenu *checkMenu;
然后 将chenckMenu指向名为IDR_MENU1 的menu,
然后 checkMenu.GetSubMenu(0);
然后 checkMenu.CheckMenuItem(ID_SHUTDOWN,MF_CHECKED);
这样可以再那个选项上显示被打勾的标志,
下次如果checkMenu.CheckMenuItem(ID_SHUTDOWN,MF_UNCHECKED);就将标识除去。但是我不知道如何将指针指向名为IDR_MENU1 的menu,
也不知道checkMenu.CheckMenuItem(ID_SHUTDOWN,MF_CHECKED);是否需要updatedata来更新显示还是它会自动显示,
请多多指点,谢谢!

解决方案 »

  1.   

    //我使用的笨办法,仅供参考。处理对话框的 WM_INITMENUPOPUP 消息:void CMYDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
    {
    CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); if (!bSysMenu)
    {
    //查看弹出菜单中是否包含 ID_SHUTDOWN 项。
    int nCount = pPopupMenu->GetMenuItemCount();
    for (int i = 0; i < nCount; i++)
    {
    if (pPopupMenu->GetMenuItemID(i) == ID_SHUTDOWN)
    {
    pPopupMenu->CheckMenuItem(ID_SHUTDOWN, MF_BYCOMMAND | (m_bChecked ? MF_CHECKED : MF_UNCHECKED));
    break;
    }
    }
    }
    }
      

  2.   

    如果你要处理的是窗口主菜单,应该用GetMenu来获得主菜单,然后再做处理;如果是要加载资源然后使用菜单,可以构造一个CMenu对象,然后LoadMenu。
      

  3.   

    CMenu checkMenu;
    checkMenu.GetSubMenu(1)->CheckMenuItem(1,MF_BYPOSITION|MF_CHECKED);//这里的1是个举例,具体看你的设计
    另外,在类向导里添加ON_UPDATE_COMMAND_UI消息函数,
    里面实现
    CheckMenuItem(1,MF_BYPOSITION|MF_UNCHECKED)
    不用updatedata
      

  4.   

    现在的情况是:void CUploadFilesDlg::OnShellNotify( WPARAM wp, LPARAM lp )中
    if ( lp == WM_RBUTTONDOWN )
    {
    checkShutDown = false;
    ::AfxGetMainWnd()->SetForegroundWindow();
    CMenu menu;
    menu.LoadMenu(IDR_MENU_RIGHT);
    CMenu *pPopup= menu.GetSubMenu(1);
    pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED);
    CPoint point;
    GetCursorPos(&point);
    pPopup->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL);
    ::AfxGetMainWnd()->PostMessage(WM_NULL,0,0);
    } 但是如果把CMenu menu;CMenu *pPopup放在类的成员变量里,就会报错,不知道为什么...
      

  5.   

    如果作为成员变量,只需要在初始化的时候做一次处理,要显示的时候执行TrackPopupMenu即可。
      

  6.   


    是处理窗口主菜单,修改后,现在的菜单只有一个,但是有两个子菜单,想在第二个子菜单的第一项上做打勾操作。
    GetMenu()->GetSubMenu(1)->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED); 只是我这样做程序直接死掉了。
    ...
      

  7.   

    本身只是一个DLG,然后加载了一个MENU,含有两个菜单。显示菜单的时候我已经用了LOADMENU,现在想在一个函数中来改变check的状态,达到打勾的目的
      

  8.   

    菜单死通过右键显示的:
    void CUploadFilesDlg::OnShellNotify( WPARAM wp, LPARAM lp )
    {
    if ( lp == WM_LBUTTONDOWN )
    {
    if ( IsWindowVisible() )
    ShowWindow( SW_HIDE );
    else
    SetWindowPlacement( & m_wndPlaceMent );
    } if ( lp == WM_RBUTTONDOWN )
    {
    checkShutDown = false;
    ::AfxGetMainWnd()->SetForegroundWindow();
    // CMenu menu;  ------------和CMenu *pPopup 放在成员变量里
    menu.LoadMenu(IDR_MENU_RIGHT);
    // CMenu *pPopup= menu.GetSubMenu(1);
    pPopup= menu.GetSubMenu(1);
    // pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED); --可以被打勾
    CPoint point;
    GetCursorPos(&point);
    pPopup->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL);
    ::AfxGetMainWnd()->PostMessage(WM_NULL,0,0);

    }---托盘的右键菜单//来更改check的状态的函数
    void CUploadFilesDlg::OnShutdown() 
    {
    // TODO: Add your command handler code here
    if(!checkShutDown)
    {
    pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED);//--直接死掉???
    checkShutDown = true;
    }
    else
    {
    pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_UNCHECKED);
    checkShutDown = false;
    }
    }
      

  9.   

    if ( lp == WM_RBUTTONDOWN ) 

    checkShutDown = false; 
    ::AfxGetMainWnd()->SetForegroundWindow(); 
    // CMenu menu;  ------------和CMenu *pPopup 放在成员变量里 
    menu.LoadMenu(IDR_MENU_RIGHT); 
    // CMenu *pPopup= menu.GetSubMenu(1); 
    pPopup= menu.GetSubMenu(1); 
    // pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED); --可以被打勾 ,但是会死程序。如果CMenu menu; 和CMenu *pPopup 放在函数局部变量里,不会死。
    CPoint point; 
    GetCursorPos(&point); 
    pPopup->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL); 
    ::AfxGetMainWnd()->PostMessage(WM_NULL,0,0); 

      

  10.   

    if ( lp == WM_RBUTTONDOWN )
    {
    checkShutDown = false; ::AfxGetMainWnd()->SetForegroundWindow();
    CMenu menu;
    menu.LoadMenu(IDR_MENU_RIGHT);
    CPoint point;
    GetCursorPos(&point);
    menu.GetSubMenu(1)->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL);
    ::AfxGetMainWnd()->PostMessage(WM_NULL,0,0);
    }
    在函数里定义menu一切正常,如果将  CMenu menu;定义在全局或者成员变量里,右键点击就只是一次,第二次就死程序,麻烦老大们指点。谢谢
      

  11.   

    可以将 CMenu 定义为局部变量,将 checkshutDown 定义为数据成员,在菜单项目的响应函数中修改这个变量的值就可以了。if ( lp == WM_RBUTTONDOWN ) 

    checkShutDown = false; 
    ::AfxGetMainWnd()->SetForegroundWindow(); 
    CMenu menu;
    menu.LoadMenu(IDR_MENU_RIGHT); 
    CMenu *pPopup= menu.GetSubMenu(1);
    pPopup= menu.GetSubMenu(1); 
    pPopup->CheckMenuItem(0, MF_BYPOSITION | (checkShutDown ? MF_CHECKED : MF_UNCHECKED));
    CPoint point; 
    GetCursorPos(&point); 
    pPopup->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL); 
    ::AfxGetMainWnd()->PostMessage(WM_NULL,0,0); 

    }
    void CUploadFilesDlg::OnShutdown() 

    // TODO: Add your command handler code here 
    if(!checkShutDown) 

       pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED);//--直接死掉??? 
       checkShutDown = true; 

    else 

       pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_UNCHECKED);    checkShutDown = false; 


      

  12.   

    你是要在右键点击的时候弹出主菜单中的第2个子菜单是吗?打勾是只针对右键菜单还是连同主菜单一起打勾?前者另构造一个CMenu对象LoadMenu,后者用GetMenu获取主菜单指针。
      

  13.   

    你是要在右键点击的时候弹出主菜单中的第2个子菜单是吗?打勾是只针对右键菜单还是连同主菜单一起打勾?前者另构造一个CMenu对象LoadMenu,后者用GetMenu获取主菜单指针。
    ---------------------------------
    我现在右键点托盘,正确显示出了MENU中第二菜单(只需要显示第二菜单)。只是我想在这个右键菜单的第一项加上打勾的功能。
      

  14.   

    如果 CMenu 是局部变量,在 OnShutdown 运行时,菜单已经删除了,此时再去设置菜单就会出错。
      

  15.   

    CMenu *pPopup= menu.GetSubMenu(1);
    改成
    CMenu *pPopup= menu.GetSubMenu(0);