实时启用/禁用CMenu项的最佳方法 我正在使用VisualC++ 6进行项目,并且我需要能够启用或禁用某些菜单项,这取决于分配给当前登录用户的权限。这是我正在使用的代码: // If the currently logged in user doesn't have permission to edit invoices if (!((CMyApp *)AfxGetApp())->UserHasPermission(PERMISSION_EditInvoice)) { // Disable the Edit Menu pMain->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); } else { // Enable the Edit Menu pMain->EnableMenuItem(1, MF_BYPOSITION | MF_ENABLED); }

实时启用/禁用CMenu项的最佳方法 我正在使用VisualC++ 6进行项目,并且我需要能够启用或禁用某些菜单项,这取决于分配给当前登录用户的权限。这是我正在使用的代码: // If the currently logged in user doesn't have permission to edit invoices if (!((CMyApp *)AfxGetApp())->UserHasPermission(PERMISSION_EditInvoice)) { // Disable the Edit Menu pMain->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); } else { // Enable the Edit Menu pMain->EnableMenuItem(1, MF_BYPOSITION | MF_ENABLED); },c++,visual-c++,mfc,C++,Visual C++,Mfc,它做的正是我想要它做的,然而我正试图找到最好的地方来放置它。如果我将其放入OnInitialUpdate(),我会得到我想要的结果,但只针对第一张打开的发票。如果在未关闭并重新打开对话框的情况下打开第二张发票,则不会再次执行代码OnUpdate()在打开其他发票时不会被调用,我发现唯一有效的地方是OnDraw(),即OnDraw()的问题是指在您尝试单击菜单项之前,菜单项的状态不会从灰色变为启用,反之亦然。我认为您必须将此代码包含在过程中 无效检查用户权限() 发生此事件时,您必须调用它: -

它做的正是我想要它做的,然而我正试图找到最好的地方来放置它。如果我将其放入
OnInitialUpdate()
,我会得到我想要的结果,但只针对第一张打开的发票。如果在未关闭并重新打开对话框的情况下打开第二张发票,则不会再次执行代码
OnUpdate()
在打开其他发票时不会被调用,我发现唯一有效的地方是
OnDraw()
,即
OnDraw()的问题
是指在您尝试单击菜单项之前,菜单项的状态不会从灰色变为启用,反之亦然。

我认为您必须将此代码包含在过程中

无效检查用户权限()

发生此事件时,您必须调用它:

- OnInitialUpdate()
- new user login (if your software permits user login/logout during the same session)
- new invoice opened

这有帮助吗?

我最后决定禁用
编辑发票
菜单项,而不是
编辑
菜单本身。事实证明,这更简单、更简洁,因为它决定了权限,并在每次打开主
“编辑”
菜单时启用或禁用该项

void CViewInvoiceView::OnUpdateEditEditinvoice(CCmdUI* pCmdUI) 
{
    // If the currently logged in user doesn't have permission to edit invoices
    if (!((CJ3App *)AfxGetApp())->UserHasPermission(PERMISSION_EditInvoice))
    {
        // Disable the Edit Menu
        pCmdUI->Enable(false);
    }
    else
    {
        // Enable the edit menu
        pCmdUI->Enable();
    }
}

某种程度上。问题不在于它不是每次发票更改时都被调用,而是我无法让GUI自我更新以显示菜单的新状态,而用户不必首先尝试单击它。