实时启用/禁用菜单项的最佳方法

时间:2011-12-04 15:47:15

标签: c++ visual-c++ mfc

我正在使用Visual C ++ 6.0开发项目,我需要能够启用或禁用某些菜单项,具体取决于分配给当前登录用户的权限。这是我正在使用的代码:

// 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);
}

它完全符合我的要求,但我正在努力找到最好的地方。如果我把它放在OnInitialUpdate()中,我会得到我想要的结果,但仅限于打开的第一张发票。如果在未关闭并重新打开对话框的情况下打开第二张发票,则不会再次执行代码。打开不同的发票时未调用OnUpdate(),而我找到的唯一有效的地方是OnDraw()OnDraw()的问题是菜单项在视觉上不可见将状态从灰色显示更改为启用,反之亦然,直到您尝试单击它为止。

2 个答案:

答案 0 :(得分:0)

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

void check_user_permission();

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

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

有帮助吗?

答案 1 :(得分:0)

我最终决定禁用Edit Invoice菜单项,而不是Edit菜单本身。这被证明更容易和更清洁,因为它确定权限,并在每次打开主'Edit菜单时启用或禁用项目。

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();
    }
}