2011-12-04 19 views
4

我正在使用Visual C++ 6.0開發一個項目,並且需要根據分配給當前登錄用戶的權限啓用或禁用某些菜單項。這是我正在使用的代碼:實時啓用/禁用CMenu項目的最佳方法

// 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()的問題在於菜單項在視覺上不會將狀態從「變灰」變爲「已啓用」,反之亦然,直到您嘗試點擊它。

回答

0

我最終決定禁用Edit Invoice菜單項,而不是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

我認爲你必須在程序中包含此代碼

void check_user_permission();

時相比,事件發生時,你必須把它叫做:

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

它可以幫助?

+0

整理。問題不在於每次更改發票時都沒有被調用,而是我無法讓GUI自行更新以顯示菜單的新狀態,而用戶不必先嚐試單擊它。 – NobodyNothing

相關問題