2010-04-03 12 views
5

Sto lavorando a un'applicazione MFC, che è diventata piuttosto complicata per anni e per diversi team di sviluppatori. Il file resource.h, che contiene tutte le mappature di comandi/messaggi, è cresciuto notevolmente nel tempo e ha molti problemi (come gli ID duplicati). Non sono competente con MFC, quindi la domanda potrebbe sembrare abbastanza stupida ...ID comando/messaggio MFC resource.h

I documenti MSDN menzionano che ID comando e ID messaggio non devono essere inferiori a WM_USER e WM_APP in modo corrispondente. Ho visto che la maggior parte degli ID di comando in resource.h generati da Visual Studio iniziano intorno a 100. Non dovrebbe causare interferenze con comandi e messaggi MFC/Windows, che si sovrappongono agli ID definiti dall'applicazione? Ad esempio, ho un ID comando:

#define ID_MY_ID 101 

e c'è un comando di Windows che ha lo stesso ID. Quando MC invia questo comando all'APP, viene gestito come un'applicazione definita ID_MY_ID e l'app sta compiendo azioni non necessarie. È uno scenario possibile?

Inoltre, c'è qualche strumento di terze parti che aiuta a profilare le risorse del progetto?

Update 1:

Nuova domanda si presentò: Qual è il modo migliore di aggiungere nuovi comandi personalizzati per le classi di applicazione? Come ho capito, prima di essere aggiunti nel modo seguente: aggiungere un ID comando al resouce.h, quindi aggiungere un gestore di mappe dei messaggi alla classe di gestione.

risposta

7

si stia mescolando due cose:

  1. gli ID dei messaggi. Questi devono essere più grandi di WM_USER. Gli ID dei messaggi non sono definiti in resource.h. Dalla tua descrizione sembra che tu non stia utilizzando messaggi privati ​​dell'applicazione.
  2. ID comando. L'applicazione stessa non deve avere ID comando duplicati. I valori ID comando non dovrebbero inoltre interferire con gli ID MFC standard definiti in afxres.h. Questi ID dei comandi partono da 0xE100, quindi è improbabile che i valori in resource.h. Il compilatore di risorse genererà un errore per gli ID duplicati nel tuo file rc

Probabilmente non è necessario modificare manualmente resource.h.

Si consiglia di utilizzare lo strumento "Simboli risorse" (fare clic con il pulsante destro del mouse sulle risorse nella vista risorse e scegliere dal menu popup, presumo che si stia utilizzando VC++), per rimuovere tutti gli ID non utilizzati da resource.h.

+0

parte del problema è che gli ID sono stati aggiunti manualmente in resource.h e anche i gestori dei comandi sono stati aggiunti manualmente alle mappe dei messaggi. Quindi il compilatore di risorse probabilmente non si lamenterà di tali duplicati. Anche lo strumento "simboli risorse" contrassegna tali comandi aggiunti manualmente come non utilizzati, sebbene vengano effettivamente utilizzati. –

+2

Lo strumento "simboli risorsa" contrassegna i comandi come non utilizzati se non si trovano nel file delle risorse (.rc). Non monitora se sono usati nel codice. – djeidot

1

I messaggi di comando vengono inviati in WM_COMMAND con l'id del comando nel parametro, quindi non entreranno in conflitto con altri messaggi.

1

Generalmente, non è necessario inserire o modificare manualmente gli identificatori nelle risorse (gli identificatori vengono automaticamente valutati da VS in modo corretto). Ci sono alcuni casi che richiedono l'interferenza manuale negli identificatori, ma si può partire dal presupposto che il lavoro dei precedenti team di sviluppatori con risorse fosse corretto. Quindi se non hai riscontrato problemi a causa delle risorse, mantienile intoccate (IMHO).

"I documenti MSDN menzionano che ID comando e ID messaggio non devono essere inferiori a WM_USER e WM_APP in modo corrispondente." - Ti sembra qualcosa di confuso.

+0

Il problema è che questa ipotesi non è corretta. La risorsa.h è stata modificata manualmente molte volte e per qualche motivo anche gli ID dei messaggi sono lì! Ecco perché ho iniziato a chiedere informazioni su di loro insieme agli ID comando. Non ho idea del motivo per cui sono stati messi lì ...forse per avere tutti gli ID di comando in un unico posto. –

+0

ID comando e ID messaggio sono cose diverse. Per quanto riguarda gli ID dei comandi, la risorsa.h è il posto giusto dove archiviare (come è stato notato). Per quanto riguarda i messaggi privati ​​- estraili in un posto separato, rimuovi gli intervalli di verifica inutilizzati, verifica gli ID sulla correttezza, spostali in posizioni appropriate (il più delle volte riesci a sorpassare i file .cpp e .h con il codice di classe della finestra per Windows che elabora tali messaggi). – VitalyVal