实时启用/禁用CMenu项的最佳方式

Best way to Enable/Disable CMenu items in real time

本文关键字:最佳 方式 CMenu 启用 禁用 实时      更新时间:2023-10-16

我正在使用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()的问题是菜单项在视觉上不会从灰色变为启用状态,反之亦然,直到您尝试单击它。

我认为你必须把这段代码包含在程序中

空白check_user_permission ();

,当这个事件发生时,你必须调用它:

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

有帮助吗?

我最终决定禁用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();
    }
}