Лучший способ включить / отключить элементы CMenu в режиме реального времени - PullRequest
4 голосов
/ 04 декабря 2011

Я работаю над проектом, использующим 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 голосов
/ 09 декабря 2011

Я решил отключить пункт меню 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();
    }
}
0 голосов
/ 09 декабря 2011

Я думаю, вы должны включить этот код в процедуру

void check_user_permission ();

, чем вы должны позвонить, когда происходят эти события:

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

Может ли это помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...