2015-01-19 14 views
7

Sto tentando di disabilitare/disabilitare le voci di menu utilizzando il metodo CMenu::EnableMenuItem().Perché non riesco a disabilitare/disabilitare i menu? (MFC)

Ho una variabile pMenu che fa riferimento al menu principale della finestra di dialogo. Posso ottenere il sottomenu usando pMenu->GetSubMenu(int) e usando submenu->GetMenuStringA(), verificare i nomi dei sottomenu/voci di menu che ottengo indietro. Tuttavia ho problemi con il metodo EnableMenuItem(). Diciamo che c'è un menu File. Al suo interno ci sono New e Open menu popup e Import, Close e Close All voci di menu. Il New e il Open dispongono di voci di sottomenu. (Es New->Document) Uso submenu->EnableMenuItem([position of submenu/menuitem], MF_BYPOSITION | MF_GRAYED); posso disattivare New o Open, comunque la funzione fallisce per Import, Close e Close All, così come tutte le voci di menu con New e Open.

Nota: quando dico che EnableMenuItem() fallisce, non intendo che restituisca -1. Restituisce lo stato precedente, ma il menu non diventa disabilitato o disabilitato.

Nella documentazione MSDN per EnableMenuItem(): http://msdn.microsoft.com/en-us/library/h62wh3y1.aspx afferma che questo funzionerà sia per le voci di menu popup che standard. Però sembra funzionare solo per i pop-up.

risposta

2

Un affermato dal ScottMcP-MVP MFC fa la configurazione del menu nel gestore ON_UPDATE_COMMAND_UI: Quando un utente della vostra applicazione tira giù un menu, ogni voce di menu deve sapere se deve essere visualizzata come abilitata o disabilitata. La destinazione di un comando di menu fornisce queste informazioni implementando un gestore ON_UPDATE_COMMAND_UI. Per ciascuno degli oggetti dell'interfaccia utente di comando nell'applicazione, utilizzare la finestra Proprietà per creare una voce di mappa dei messaggi e un prototipo di funzione per ciascun gestore.

Quando il menu è tirato verso il basso, le ricerche quadro per e chiede ogni gestore ON_UPDATE_COMMAND_UI, ogni gestore chiama funzioni membro CCmdUI quali Enable e Check, e il quadro poi visualizza in modo appropriato ogni voce di menu.

Ciò significa che è necessario memorizzare nelle proprie classi lo stato previsto per la voce di menu che può essere selezionata/deselezionata. Dovrai inserire una macro ON_UPDATE_COMMAND_UI per elemento di menu vicino alla macro ON_COMMAND e quell'elemento farà riferimento a una funzione che riceve l'oggetto CCmdUi che puoi modificare in base alle tue esigenze. Ma poiché stai usando MFC, normalmente non lo fai a mano ma semplicemente usi le proprietà delle finestre che contengono il menu.

+0

Capisco cosa stai dicendo, ma non è proprio quello che sto cercando di fare. Non sto cercando di abilitare/disabilitare gli elementi con l'applicazione. Sto chiamando tutti questi metodi all'interno di un'applicazione esterna. – Amre

+2

In definitiva non sarai in grado di farlo! Dovresti invece inviare messaggi personalizzati all'applicazione MFC dicendogli che alcune voci di menu dovrebbero essere in grigio. Quindi, all'interno dell'applicazione MFC, sarà possibile utilizzare il gestore ON_UPDATE_COMMAND_UI per abilitarli/disabilitarli. Non riesco a immaginare un altro modo per un'applicazione MFC. –

+0

C'è un modo per chiamare il gestore onnmand o Bn_clicked se conosco l'id del menu? Ho provato a utilizzare sendmessage e postmessage passando l'handle della finestra principale e BN_CLICKED e WM_COMMAND ma non sembra funzionare. – Amre

7

MFC ha un altro schema per abilitare/disabilitare le voci di menu e tale schema annulla ciò che si sta facendo. Per lavorare all'interno del sistema di MFC si aggiungono gestori di messaggi ON_UPDATE_CMD_UI come descritto qui:

http://msdn.microsoft.com/en-us/library/6kc4d8fh.aspx

+0

Il problema è che faccio tutto questo da un'applicazione esterna. Sto usando il manico della finestra principale per ottenere il suo menu, quindi utilizzo GetSubMenu per ottenere i suoi sottomenu, non ho accesso all'oggetto CCmdUI. – Amre

+0

@Are quindi sei bloccato. L'applicazione che stai tentando di controllare reimposta lo stato abilitato/disabilitato costantemente tramite il proprio oggetto CCmdUI e ogni modifica apportata verrà ripristinata in millisecondi. –

+0

In sostanza, ciò che sto cercando di ottenere è inviare il messaggio oncommand al pulsante.Sto provando a creare un'app che possa essere utilizzata per testare la sicurezza della mia app, contro qualcuno che invia il comando oncommand o bn_clicked a un controllo e accede a qualcosa che non dovrebbero. – Amre

Problemi correlati