Questa nota descrive come l'editor di risorse di Visual C++ supporta più file di risorse e header file condivisi in un singolo progetto o condividevano tra più progetti e come è possibile usufruire di tale supporto. Questa nota risponde a queste domande:
È necessario tenere presente che se si aggiunge un file di risorse aggiuntive al progetto, ClassWizard non riconoscerà le risorse nel file aggiunto.
Questa nota è strutturata per rispondere alle domande di cui sopra come segue:
Panoramica di come Visual C++ gestisce i file di risorse e file di intestazione
Visual C++ gestisce un singolo.File di risorse RC e un corrispondente.File di intestazione h come una coppia tightly coupled di file. Quando si modifica e salva le risorse in un.File RC, indirettamente modificare e salvare i simboli nel corrispondente.File H. Anche se è possibile aprire e modificare più.File RC alla volta (tramite interfaccia utente di Visual C++ MDI) per qualsiasi dato.File RC è indirettamente modificare un solo file di intestazione corrispondente.
File di intestazione del simbolo
Per impostazione predefinita, Visual C++ sempre i nomi file di intestazione corrispondente risorsa.H, indipendentemente dal nome del file di risorse (ad esempio, MYAPP.RC). Usando il comando Set include File in Visual C++, è possibile modificare il nome di questo file di intestazione aggiornando il file File di intestazione del simbolo nella finestra di dialogo Set include.
Direttive di simbolo di sola lettura
Sebbene Visual C++ edita solo un file di intestazione per qualsiasi dato.File RC, Visual C++ supporta i riferimenti a simboli definiti nei file di intestazione aggiuntiva di sola lettura. Usando il comando Set include File in Visual C++, è possibile specificare un numero qualsiasi di file di intestazione aggiuntiva di sola lettura come direttive simbolo di sola lettura. La restrizione "sola lettura" significa che quando si aggiunge una nuova risorsa della.File RC, è possibile utilizzare un simbolo definito nel file di intestazione in sola lettura; ma se si elimina la risorsa, il simbolo rimane ancora definito nel file di intestazione di sola lettura. Non si può cambiare il valore numerico assegnato a un simbolo di sola lettura.
Direttive in fase di compilazione
Visual C++ supporta anche la nidificazione di file di risorse, dove una.File RC è # specificato all'interno di un altro. Quando modifica un determinato.File RC utilizzando Visual C++, eventuali risorse nei file # specificato non sono visibili. Ma quando compilano i.File RC, i file # specificato anche vengono compilati. Usando il comando Set include File in Visual C++, è possibile specificare un numero qualsiasi di # specificato.File RC come direttive in fase di compilazione.
Si noti che cosa succede se leggete in Visual C++ un.Del file RC che # includono un altro.RC file non è specificata come una direttiva in fase di compilazione. Questa situazione dovesse insorgere quando si mettono a Visual C++ un.File RC che vi era stato precedentemente mantenendo manualmente con un editor di testo. Quando Visual C++ legge il # specificato.File RC, esso unisce le risorse # specificato in padre.File RC. Quando si salva il genitore.File RC, istruzione, il # include in vigore, sarà sostituito dalle risorse # specificato. Se non si desidera questo tipo merge che accada, è necessario rimuovere il # include istruzione dal padre.File RC preventiva a leggerlo in Visual C++; quindi utilizzando Visual C++, aggiungere nuovamente la stessa istruzione come una fase di compilazione direttiva # include.
Visual C++ Salva in un.RC file tre tipi di sopra Set include informazioni (simbolo File di intestazione, le direttive di simbolo di sola lettura e direttive in fase di compilazione) in n. includere direttive e nelle risorse TEXTINCLUDE. Le risorse TEXTINCLUDE, un dettaglio di implementazione che non normalmente necessario affrontare, sono spiegate in Modo Visual C++ gestisce Set include informazioni.
Analisi della creazione guidata applicazione creati.RC e.File H
Esaminare il codice dell'applicazione prodotto dalla creazione guidata applicazione fornisce spaccato come Visual C++ gestisce diversi file di risorse e file di intestazione. I codice estratti esaminati qui di seguito sono da un'applicazione MYAPP prodotta dalla creazione guidata applicazione utilizzando le opzioni di default.
Un'applicazione di creazione guidata applicazione creati utilizza più file di risorse e più file di intestazione, come sintetizzato nello schema seguente:
nbsp; RISORSA.H AFXRES.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
È possibile visualizzare queste relazioni multiple di file utilizzando il comando Set/Visual C++ File include.
MYAPP.RC
File di risorse dell'applicazione che modificati utilizzando Visual C++.
RISORSA.H è il file di intestazione specifico dell'applicazione. Sempre prende delle risorse.H da AppWizard, coerente con l'impostazione predefinita di Visual C++ di denominazione dei file di intestazione. La # include per il file di intestazione è la prima istruzione nel file di risorse (MYAPP.RC):
//Microsoft visual C++ generato script di risorsa
//
# include "Resource. h"
RES\MYAPP.RC2
Contiene le risorse che non saranno modificate da Visual C++, ma saranno inclusi in finale compilato.File EXE. Creazione guidata applicazione non crea tali risorse per impostazione predefinita, poiché Visual C++ possono modificare tutte le risorse standard, tra cui la risorsa della versione (una nuova caratteristica di questa release). Un file vuoto viene generato da creazione guidata applicazione nel caso in cui si desidera aggiungere il proprio le risorse formattate personalizzate a questo file.
Se si utilizzano le risorse formattate personalizzate, è possibile aggiungere a RES\MYAPP.RC2 e modificarli utilizzando l'editor di testo di Visual C++.
AFXRES.RC e AFXPRINT.RC contengono risorse standard richieste dal determinate funzionalità del framework. Come RES\MYAPP.RC2, questi due file di risorsa fornita quadro sono # specificato alla fine di MYAPP.RC ed essi vengono specificati nelle direttive di compilazione della finestra di dialogo Set include. Così, voi non direttamente visualizzare o modificare queste risorse quadro mentre si modifica MYAPP.RC in Visual C++, ma essi sono compilati in binario dell'applicazione.File RES e finale.File EXE. Per ulteriori informazioni sulle risorse quadro standard, incluse le procedure per la modifica dei loro, vedere tecnica nota 23.
AFXRES.H definisce standard simboli, come ID_FILE_NEW, utilizzata dal framework e specificamente utilizzato in AFXRES.RC. AFXRES.H # includono anche di WINRES.H, che contiene un sottoinsieme di WINDOWS.H che sono necessari da Visual C++ generato.File RC, nonché AFXRES.RC. I simboli definiti in AFXRES.H sono disponibili durante la modifica di file di risorse dell'applicazione (MYAPP.RC). Ad esempio, ID_FILE_NEW è utilizzato per la voce di menu Nuovo File in MYAPP.Risorsa di menu di RC. Non potete modificare o eliminare questi simboli definiti dal quadro.
Inclusione di file aggiuntivi di intestazione
L'applicazione creata da creazione guidata applicazione include solo due file di intestazione: risorsa.H e AFXRES.H. solo la risorsa.H è specifico dell'applicazione. Potrebbe essere necessario includere file di intestazione aggiuntiva di sola lettura nei seguenti casi
Il file di intestazione è fornito da una fonte esterna, o si desidera condividere il file di intestazione tra più progetti o più parti dello stesso progetto.
Il file di intestazione ha formattazione e commenti che non desidera Visual C++ per cambiare o filtrare fuori quando salva il file. Ad esempio, forse si vuole preservare # di definire che utilizzano aritmetica simbolico come:
# define rosso 0
# define BLUE 1
# define verde 2
# define ID_COLOR_BUTTON 1001
# define ID_RED_BUTTON (ID_COLOR_BUTTON + rosso)
# define ID_BLUE_BUTTON (ID_COLOR_BUTTON + blu)
# define ID_GREEN_BUTTON (ID_COLOR_BUTTON + verde)
È possibile includere i file di intestazione aggiuntiva di sola lettura utilizzando il comando Set include File per specificare l'istruzione come una seconda direttiva simbolo di sola lettura, il # include come in:
# include "afxres.h"
# include "second.h"
Il nuovo diagramma delle relazioni tra file ora assomiglia a questo:
nbsp; AFXRES.RISORSA H.SECONDO H.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
La condivisione di un File di intestazione tra due.File RC
Si desidera condividere un file di intestazione tra due.File RC che si trovano in diversi progetti, o forse lo stesso progetto. Per farlo, semplicemente applicare la tecnica di sola lettura direttive sopra descritta a entrambi.File RC. Nel caso in cui i due.File RC sono per diverse applicazioni (diversi progetti), il risultato è illustrato nel diagramma seguente:
nbsp; RISORSA.H AFXRES.RISORSA H.H (per MYAPP1) seconda.H (for MYAPP2)
\ / \ /
\ / \ /
MYAPP1.RC MYAPP2.RC
/ \ / \
/ \ / \
RES\MYAPP1.RC2 AFXRES.RC RES\MYAPP2.RC2 AFXPRINT.RC & nbsp
Nel caso in cui il secondo file di intestazione è condiviso da due.File RC nella stessa applicazione (progetto) viene illustrato di seguito.
Utilizzo di più file di risorsa nello stesso progetto
Visual C++ e il compilatore di risorse supporto multiplo.File RC nello stesso progetto attraverso # di includere di uno.RC file all'interno di un altro. È consentita la nidificazione multiple. Ci sono vari motivi per suddividere le risorse del vostro progetto in più.File RC:
È possibile # includono un secondo.RC nelle direttive di compilazione nella finestra di dialogo Set include:
# i&nclude "res\myapp.rc2"nbsp; / / non - Visual C++ edited resources
# include "second.rc" / / la seconda.FILE RC
# include "afxres. RC" / / Standard componenti
# include "afxprint.rc" / / stampa/stampa anteprima risorse
Il risultato è illustrato nel diagramma seguente:
nbsp; RISORSA.H AFXRES.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
IN SECONDO LUOGO.RC AFXRES.RC AFXPRINT.RC & nbsp
Utilizzo di direttive in fase di compilazione, è possibile organizzare le risorse di Visual C++ modificabili e non modificabili in multiple.File RC, dove il "maestro" MYAPP.RC non fa nulla ma # include l'altro.File RC. Se si utilizza un progetto Visual C++.File MAK, allora si dovrebbe includere il "maestro".RC file nel progetto in modo che tutte le risorse # specificato vengono compilate con l'applicazione.
Esecuzione di file Non modificabile Visual C++
La creazione guidata applicazione creati RES\MYAPP.File RC2 è un esempio di un file che contiene le risorse che fai non vuole leggere accidentalmente in Visual C++ e poi lo scrivo di nuovo fuori con perdita di informazioni di formattazione. Per proteggere contro questo, abbiamo posto le seguenti righe all'inizio del RES\MYAPP.File RC2:
# ifdef APSTUDIO_I&NVOKED
nbsp; # Error questo file non è modificabile da Visual C++
# endif //APSTUDIO_INVOKED
Quando Visual C++ compila il.File RC, esso definisce APSTUDIO_INVOKED così come RC_INVOKED. Se la struttura dei file creati da creazione guidata applicazione è danneggiata e Visual C++ si legge la riga # Error qui sopra, segnala un errore fatale e interrompere la lettura della.File RC.
La gestione condivisione da più Visual C++-a cura di simboli.File RC
Due problemi sorgono quando sciolse le risorse in più.File RC che si desiderano modificare separatamente in Visual C++:
Il diagramma seguente illustra un'organizzazione.RC e.File h che affronta la questione prima:
nbsp; MYAPP.RC
/ \
/ \
MYSTRS.H / MYSHARED.H \ MYME&NUS.H
\ / / \ \ \
\ / / \ \ \
MYSTRS.RC MYMENUS.RC
In questo esempio, le risorse di tipo stringa sono conservate nel file di risorse, MYSTRS.RC e i menu sono conservati in un altro, MYMENUS.RC. Alcuni simboli, ad esempio per i comandi, potrebbero essere necessario essere condivisi tra i due file. Per esempio, un ID_TOOLS_SPELL può essere l'ID di comando dal menu per l'elemento incantesimo in un menu Strumenti; e può anche essere l'ID di stringa del prompt visualizzati dal framework nella barra di stato finestra principale dell'applicazione.
Il simbolo ID_TOOLS_SPELL è mantenuto nel file di intestazione condiviso, MYSHARED.H. si mantiene manualmente il file di intestazione condivisa con un editor di testo; Visual C++ non direttamente modificarlo. Nella risorsa due files MYSTRS.RC e MYMENUS.RC, specificare # includono MYSHARED.H nelle direttive di sola lettura per MYAPP.RC, utilizzando il comando Set include File, come descritto in precedenza.
Esso è più conveniente per anticipare un simbolo condividerà prima di tentare di utilizzare per identificare qualsiasi risorsa. Aggiungere il simbolo al file di intestazione condiviso e, se già non lo avete # specificato nel file di intestazione condivisa nelle direttive di sola lettura per la.RC file, farlo prima di utilizzare il simbolo. Se non si prevede di condivisione il simbolo in questo modo, allora si dovrà manualmente (utilizzando un editor di testo) mossa il # definire istruzione per il simbolo da, diciamo, MYMENUS.H a MYSHARED.H prima di utilizzarlo in MYSTRS.RC.
Quando gestire simboli in multiple.File RC, è anche necessario aiutare Visual C++ evitare di assegnare lo stesso ID di valori numerici alle risorse distinte (simboli). Per qualsiasi dato.File RC, Visual C++ assegna in modo incrementale IDs in ciascuno dei quattro domini ID. Tra le sessioni di editing, tiene traccia di Visual C++ l'ultimo ID esso assegnato in ciascuno dei domini nel file di intestazione simbolo per il.File RC. Ecco che cosa sono i valori APS_NEXT per una vuota (nuovo).File RC:
# define _APS_&NEXT_RESOURCE_VALUEnbsp; 101
# define _APS_NEXT_COMMAND_VALUE 40001
# define _APS_NEXT_CONTROL_VALUE 1000
# define _APS_NEXT_SYMED_VALUE 101
_APS_NEXT_RESOURCE_VALUE è il valore di simbolo successivo che verrà utilizzato per una risorsa finestra di dialogo, risorsa di menu e così via. L'intervallo valido per i valori di risorsa simbolo è 1-0x6FFF.
_APS_NEXT_COMMAND_VALUE è il valore di simbolo successivo che verrà utilizzato per un'identificazione comando. L'intervallo valido per i valori di simbolo di comando è 0x8000-0xDFFF.
_APS_NEXT_CONTROL_VALUE è il valore di simbolo successivo che verrà utilizzato per un controllo della finestra di dialogo. L'intervallo valido per i valori di finestra di dialogo controllo simbolo è 8-0xDFFF.
_APS_NEXT_SYMED_VALUE è il valore di simbolo successivo che sarà emesso quando si assegna manualmente un valore di simbolo usando il nuovo comando nel Browser simbolo.
Visual C++ inizia con valori leggermente più alti che il legale più basso valore quando la creazione di una nuova.File RC. Creazione guidata applicazione verrà inizializzato anche questi valori a qualcosa di più appropriato per applicazioni MFC. Per ulteriori informazioni sugli intervalli di valore ID, vedere tecnica nota 20.
Ora ogni volta che si crea un nuovo file di risorse, anche nello stesso progetto, Visual C++ definisce gli stessi valori _APS_NEXT_ . Questo significa che se si aggiunge, diciamo, multiple agganciabili in due differenti.File RC, è altamente probabile che la stessa # definire il valore verrà assegnato alle diverse finestre di dialogo. Ad esempio, IDD_MY_DLG1 nel primo.File RC potrebbe essere assegnato lo stesso numero, 101, come IDD_MY_DLG2 in un secondo.File RC.
Per evitare questo, si deve prenotare un intervallo numerico separato per ciascuno dei quattro domini di ID rispettivamente.File RC. Fare questo aggiornando manualmente i valori _APS_NEXT in ciascuna dei.File RC prima che si inizia ad aggiungere risorse. Ad esempio, se il primo.File RC utilizza i valori di default _APS_NEXT , allora si potrebbe desiderare di assegnare i seguenti valori _APS_NEXT al secondo.File RC:
# define _APS_&NEXT_RESOURCE_VALUEnbsp; 2000
# define _APS_NEXT_COMMAND_VALUE 42000
# define _APS_NEXT_CONTROL_VALUE 2000
# define _APS_NEXT_SYMED_VALUE 2000
Naturalmente, è ancora possibile che Visual C++ assegnerà tanti ID nel primo.File RC che i valori numerici iniziano a sovrapporsi a quelli riservati per il secondo.File RC. Si devono prenotare sufficientemente grande gamme affinché ciò non accada.
Gestione delle dipendenze tra.RC.CPP, e.File H
Quando si salva Visual C++ un.File RC, salva anche simbolo modifiche alla risorsa corrispondente.File H. Uno qualsiasi dei vostri.File CPP che fanno riferimento a risorse nella.File RC deve # include la risorsa.File H, solitamente di dentro il file di intestazione maestro del vostro progetto. Questo porta a un effetto collaterale indesiderato a causa di gestione del progetto interno dell'ambiente di sviluppo che consente di analizzare i file di origine per le dipendenze di intestazione. Ogni volta che si aggiunge un nuovo simbolo in Visual C++, tutte le.File CPP che # include la risorsa.H avrebbe bisogno di essere ricompilato.
In Visual C++, aggira la dipendenza delle risorse.H includendo il seguente commento come prima riga della risorsa.File H:
//{{NO_DEPENDENCIES}}
L'ambiente di sviluppo interpreta questo commento, ignorando le modifiche alla risorsa.H così quel dipendente.File CPP non dovrà essere ricompilato.
Visual C++ sempre aggiunge il //{{NO_DEPENDENCIES}} commento riga a una.RC file quando salva il file. In alcuni casi, elusione della dipendenza costruire sulla risorsa.H può portare ad errori di runtime non rilevati in fase di collegamento. Ad esempio, se si utilizza il Browser simbolo per modificare il valore numerico assegnato a un simbolo di una risorsa, la risorsa verrà non correttamente trovare e caricare a se di applicazione Runtime il.File CPP, che fa riferimento alla risorsa non viene ricompilata. In tali casi, è opportuno in modo esplicito ricompilare qualsiasi.File CPP che conoscete sono colpiti dai cambiamenti nella risorsa simbolo.H o selezionare ricostruire tutto. Se avete la necessità di cambiare frequentemente valori simbolo per un certo gruppo di risorse, probabilmente troverete più comodo e sicuro uscire questi simboli in un file di sola lettura intestazione, come descritto nella sezione precedente Tra cui ulteriori file di intestazione.
Come riesce a Visual C++ Set contiene le informazioni
Come discusso in precedenza, menu File di comando Set include consente di specificare tre tipi di informazioni:
Quanto segue descrive come Visual C++ mantiene queste informazioni in un.File RC. Non avete bisogno di queste informazioni per utilizzare Visual C++, ma può migliorare la vostra comprensione con più fiducia può utilizzare la funzione Set include.
Ciascuno dei tipi di Set include informazioni tre sopra è memorizzato nella.File RC in due forme: (1) come # includono o altre direttive interpretabile dal compilatore di risorse e (2) come risorse TEXTINCLUDE speciali interpretabili solo da Visual C++.
Lo scopo della risorsa TEXTINCLUDE consiste nell'archiviare in modo sicuro Set includono informazioni in una forma che è prontamente presentabile nella finestra di dialogo di Set include di Visual C++. TEXTINCLUDE è un tipo di risorsa definite da Visual C++. Visual C++ riconosce tre risorse specifiche TEXTINCLUDE che hanno la risorsa numeri di identificazione, 1, 2 e 3:
| ID risorsa TEXTINCLUDE. | Tipo di Set include informazioni |
| 1 | File di intestazione del simbolo |
| 2 | Direttive di simbolo di sola lettura |
| 3 | Direttive in fase di compilazione |
Ciascuno dei tre tipi di Set include informazioni è illustrata dal default MYAPP.RC e risorsa.H file creati da creazione guidata applicazione, come descritto di seguito. il \0 extra e "" token tra i blocchi BEGIN ed END sono tenuti dalla sintassi RC per specificare rispettivamente zero stringhe terminate e il carattere di virgolette.
File di intestazione del simbolo
La forma delle informazioni File di intestazione simbolo interpretate dal compilatore di risorse è semplicemente # include la dichiarazione:
# include "Resource. h"
La corrispondente risorsa TEXTINCLUDE è:
1 TEXTINCLUDE DISCARDABLE
BEGIN
# resource.h\0 "
FINE
Direttive di simbolo di sola lettura
Le direttive di simbolo di sola lettura sono incluse nella parte superiore della MYAPP.RC nella seguente forma interpretabile dal compilatore di risorse:
# include "afxres.h"
La corrispondente risorsa TEXTINCLUDE è:
TEXTINCLUDE 2 DISCARDABLE
BEGIN
"# include" "afxres.h""\r\n"
"\0"
FINE
Direttive in fase di compilazione
Direttive in fase di compilazione sono incluse alla fine di MYAPP.RC nella seguente forma interpretabile dal compilatore di risorse:
# IF&NDEF APSTUDIO_INVOKED
///////////////////////
//
/ / Da TEXTINCLUDE 3
//
# include "res\myapp.rc2"nbsp; / / non - Visual C++ edited resources
# include "afxres. RC" / / Standard componenti
# include "afxprint.rc" / / stampa/stampa anteprima risorse
# endif / / non APSTUDIO_INVOKED
La direttiva APSTUDIO_INVOKED # ifndef indica Visual C++ per saltare le direttive in fase di compilazione.
La corrispondente risorsa TEXTINCLUDE è:
TEXTI&NCLUDE 3 DISCARDABLE
BEGIN
"# include" "res\myapp.rc2""nbsp; / / non - Visual C++ edited resources\r\n "
"\r\n"
"# include""afxres. RC" "/ / Standard components\r\n"
"# include""afxprint.rc" "/ / stampa/stampa resources\r\n anteprima"
"\0"
FINE
&Note tecniche per numero |nbsp; Note tecniche per la categoria