TN035: Використання декількох файли ресурсів та заголовні файли з Visual c + +

Цієї записці описується, як редактор ресурсів Visual C++ підтримує кілька файли ресурсів та заголовні файли, спільні в один проект або спільно кількома проектами, і як ви можете скористатися підтримку. Ця Примітка відповіді на ці питання:

Ви повинні знати, що якщо ви додасте додаткові ресурс-файл до проекту, ClassWizard не визнають ресурсів у файлі додано.

Ця Примітка структурована відповіді вище питання в наступному:

Огляд того, як Visual C++ вдається файли ресурсів та заголовні файли

Visual C++ вдається одного.Файл RC ресурсів і принципах.H заголовка файлу як пару щільно поєднанні файлів. Коли редагування та збереження ресурсів в це.RC файли, ви опосередковано редагувати і зберігати символи у відповідні.H-файлу. Хоча можна відкривати та редагувати кількома.RC файли одночасно (за допомогою Visual C++ MDI користувальницький інтерфейс) для будь-якого огляду.RC файли, які ви опосередковано редагувати лише одна відповідний заголовний файл.

Символ заголовка файлу

За промовчанням Visual C++ завжди імена відповідний заголовний файл ресурсів.H, незалежно від того, щоб ім'я файлу ресурсів (наприклад, MYAPP.RC). Використання команди файл набір включає в Visual C++, можна змінити ім'я цього заголовка файлу шляхом оновлення символу заголовка файлу файл у діалоговому вікні набір включає.

Лише читання символ Директиви

Хоча Visual C++ редагує лише один файл для будь-якого огляду.RC файли, Visual C++ підтримує посилання на символи, визначені в додаткові заголовки лише для читання. Використання команди файл набір включає в Visual C++, можна вказати будь-яку кількість додаткових лише для читання заголовні файли як Read-Only символу Директиви. Обмеження "тільки читання" означає, що під час додавання нових ресурсів в регіоні.RC файли, ви можете використовувати символ, визначений у файл лише для читання заголовка; Але якщо видалити ресурс, символ все ще залишається визначені у файл лише для читання заголовка. Ви не можете змінити числове значення, призначено лише для читання символ.

Компіляції Директиви

Visual c + + також підтримує вкладеності файли ресурсів, де один.RC це # include'd в межах іншого. Коли ви редагуєте на даний.RC файли за допомогою Visual c + +, будь-які ресурси в # include'd файли не відображаються. Але коли ви скласти в.RC файли, файли # include'd також склав. Використання команди файл набір включає в Visual C++, можна вказати будь-яку кількість # include'd.RC файли як компіляції Директиви.

Зверніть увагу, що станеться, якщо ви читали в Visual C++.RC файлу, що # включити в інший.RC, що файл не вказано директиви компіляції. Ця ситуація можуть виникнути, коли ви принести Visual c + + є.RC файли, які ви мали були раніше збереження вручну у текстовому редакторі. Коли Visual C++ читає #, include'd.RC файли, вона об'єднує # include'd ресурси в батьків.RC файли. Під час збереження батьків.RC файли, # include заяву, по суті, буде замінений # include'd ресурси. Якщо ви не хочете цього злиття відбудеться, слід видалити з # включити заяву від батьківського об'єкта.RC файли попередньої на читання в Visual C++; потім за допомогою Visual C++, додати назад ж # включити заяву як компіляції Директиви.

Visual c + +, що зберігає в це.RC файлу три види з вище набір включає в себе інформацію (символ заголовка файлу, Read-Only символом директив та компіляції Директиви) в # включити Директиви і TEXTINCLUDE ресурси. TEXTINCLUDE ресурсів, реалізації докладно, що ви зазвичай не потрібно мати справу з, пояснив, Як Visual C++ керує набір містить інформацію , у.

Аналіз AppWizard створений.RC і.Файли h

Вивчення застосування код, отриманий шляхом AppWizard дає уявлення як Visual C++ вдається кілька файли ресурсів та файли заголовків. Фрагменти коду, розглядаються нижче є з виробництва AppWizard, використовуючи стандартні параметри програми MYAPP.

AppWizard створена програма використовує кілька файли ресурсів і кілька файли заголовків, як показано на малюнку нижче:

nbsp;  РЕСУРС.H AFXRES.H                    
          \       /                              
           \     /                                
          MYAPP.RC                               
              |                                
              |                              
        RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
 

Ви можете переглянути ці кілька відносини файл за допомогою команди візуальних файл c + + / набір включає в себе.

MYAPP.RC

Файл застосунку ресурсів, які редагувати за допомогою Visual c + +.

РЕСУРС.H є певним застосунком заголовка файлу. Він називається завжди РЕСУРСОМ.Год за AppWizard, відповідають за замовчуванням Visual C++ іменування заголовка файлу. # Include для цього заголовка файлу є перший оператор у файл ресурсів (MYAPP.RC):

//Microsoft visual C++ generated сценарію ресурс
//
# включити "resource.h"

RES\MYAPP.RC2

Містить ресурси, які не вдається змінити Visual c + +, але будуть включені у фіналі, складений.EXE файлу. AppWizard створює немає таких ресурсів за промовчанням, оскільки Visual C++ можуть редагувати всі стандартні ресурсів, включаючи Версія ресурсу (нова функція у цьому випуску). Файл пустий породжується AppWizard, у випадку, якщо ви хочете додати власні користувацькі форматований ресурсів для цього файлу.

Якщо використовується власний формат ресурсів, можна додати їх до RES\MYAPP.RC2 і редагувати їх за допомогою текстового редактора Visual c + +.

AFXRES.RC і AFXPRINT.RC містить стандартні ресурсів, потрібних певних функцій у рамках. Як RES\MYAPP.RC2, ці два файли умови для рамки ресурсів є # include'd в кінці MYAPP.RC і вони визначаються у директивах компіляції діалогового вікна набір включає в себе. Таким чином, ви не безпосередньо переглянути або змінити ці ресурси середовища, під час редагування MYAPP.RC в Visual C++, але вони зібрані в двійкові програми.RES файл і фінал.EXE файлу. Більш детальну інформацію про стандартні рамках ресурсів, включаючи процедури для їх перегляньте технічне Примітка 23.

AFXRES.H визначає стандартні символи, такі як ID_FILE_NEW, використовуються рамках і конкретно використовується в AFXRES.RC. AFXRES.H, також # включити в WINRES.H, яка містить частину WINDOWS.H, які потрібні на Visual C++, породжених.RC файли, а також AFXRES.RC. Знаків, визначених у AFXRES.H доступні під час редагування файлу ресурсів застосунку (MYAPP.RC). Наприклад, ID_FILE_NEW , що використовується для нового файлу пункт меню в MYAPP.RC в меню ресурс. Не можна змінити або видалити ці символи, визначені у рамках.

У тому числі додаткові файли заголовків

Застосування AppWizard створений включає в себе тільки два файли заголовків: РЕСУРСУ.H і AFXRES.H. тільки РЕСУРС.H є певним застосунком. Можливо, потрібно буде включати додаткові заголовки лише для читання, в таких випадках

Файл заголовка забезпечується зовнішнього джерела, або ви хочете поділитися заголовка файлу серед кількох проектів або декілька частин ж проекту.

Заголовний файл має форматування та коментарі, що ви не хочете Visual c + +, щоб змінити або відфільтрувати, коли вона зберігає файл. Наприклад, може бути потрібно зберегти # визначити, які використовують символічне арифметичне таких як:

# визначити ЧЕРВОНОГО 0
# визначити синій 1
# визначити зелений 2
# визначити ID_COLOR_BUTTON 1001
# визначити ID_RED_BUTTON (ID_COLOR_BUTTON + червоний)
# визначити ID_BLUE_BUTTON (ID_COLOR_BUTTON + синій)
# визначити ID_GREEN_BUTTON (ID_COLOR_BUTTON + зелений)

Ви можете включити додаткові заголовки лише для читання за допомогою команди файл набір включає в себе, щоб визначити # include заяву як другий Read-Only символ директиви, як у:

# включити "afxres.h"
# включити "second.h"

Нова схема файлу тепер виглядає наступним чином:

nbsp;                  AFXRES.H РЕСУРС.H ДРУГОГО.H                    
          \       /                              
           \     /                                
          MYAPP.RC   
              |                                
              |                              
        RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
 

Обмін файл між двома.RC файли

Ви можете поділитися файл між двома.RC файли у різних проектів, або, можливо, самий проекту. Щоб зробити це, просто застосуйте Директиви Read-Only методика, описана вище на обох.RC файли. У випадку, де два.RC файли, для різних додатків (різних проектів), у результаті проілюстровано нижче:

nbsp;    РЕСУРС.H AFXRES.H РЕСУРС.H (для MYAPP1) другий.H   (for MYAPP2)             
          \       /     \       /           
           \     /       \     /             
          MYAPP1.RC MYAPP2.RC                 
           /    \        /     \                   
          /      \      /       \            
RES\MYAPP1.RC2 AFXRES.RC RES\MYAPP2.RC2 AFXPRINT.RC & nbsp
 

Так, де другий файл заголовка поділяють два.Нижче обговорюються RC файли в одному додатку (проект).

За допомогою кількох ресурс файлів в одному проекті

Visual c + + і компілятор ресурсів підтримує кілька.RC файлів в одному проекті через # включити до одного.RC файли в інший. Допускається кілька вкладення. Існують різні причини, щоб розділити ваш проект ресурси на кілька.RC файли:

Ви можете # включити СЕКУНДИ.RC у директивах компіляції в діалоговому вікні набір включає:

# включити "res\myapp.rc2"  / / non - Visual c + + редагувати ресурси
# включити "second.rc" / / другий.RC ФАЙЛУ

# включити "afxres.rc" / / стандартний компонентів
# включити "afxprint.rc" / / друк/друк перегляду ресурсів

Результат показано нижче:

nbsp;  РЕСУРС.H AFXRES.H                    
          \       /                              
           \     /                                
          MYAPP.RC
              |                                
              |                              
        RES\MYAPP.RC2
        ДРУГИЙ.RC AFXRES.RC AFXPRINT.RC & nbsp
 

За допомогою Директиви компіляції, можна впорядкувати Visual C++ для редагування та не підлягає редагуванню ресурсів декількох.RC файли, де "Майстер" MYAPP.RC нічого не робить, але # включити інші.RC файли. Якщо ви використовуєте проекту Visual c + +.Мак файл, то ви повинні включити "Магістр".RC файл в проект, так що всі ресурси # include'd складаються своїй заявці.

Виконання файлів, що не підлягає редагуванню Visual c + +

AppWizard створені RES\MYAPP.RC2 файл є прикладом файл, що містить ресурси, що ви не хочете, щоб випадково читати в Visual C++ а потім написати його назад з втратою відомості про форматування. Захиститися від цього, ми надаємо наступні рядки на початку на RES\MYAPP.Файл RC2:

#IFDEF APSTUDIO_I&NVOKED
 nbsp;  #Error цей файл не є для редагування на Visual c + +
#endif //APSTUDIO_INVOKED

Коли Visual C++ збирає на.RC файли, вона визначає, APSTUDIO_INVOKED , а також RC_INVOKED. Якщо структура AppWizard створений файл пошкоджено, і Visual C++ читає #error рядок вище, він повідомляє критична помилка і припинити читання на.RC файли.

Управління символи, які спільно використовуються декілька Visual C++-редакції.RC файли

Під час розділення роботу вашого ресурсу в декількох виникають два питання.RC файли, які потрібно редагувати окремо в Visual C++:

На схемі нижче відображено організацію.RC і.Файли H, яка займається перший випуск:

nbsp;             MYAPP.RC
             /         \
            /           \
MYSTRS.H / MYSHARED.H \ MYME&NUS.H
     \    /    /      \   \    \
      \  /    /        \   \    \
   MYSTRS.RC MYMENUS.RC

У цьому прикладі рядок ресурсів зберігаються в один ресурс-файл, MYSTRS.RC і меню зберігаються в іншому MYMENUS.RC. Деякі символи, наприклад, до команд, може знадобитися розподілятися між двома файлами. Наприклад, на ID_TOOLS_SPELL може бути Ідентифікатор команди меню для заклинання елемента в меню Знаряддя; і це також може бути Ідентифікатор рядок командного рядка, за рамки в головному вікні програми в рядку стану відображається.

Символ ID_TOOLS_SPELL зберігається у файлі спільного заголовка, MYSHARED.H. зберегти цей файл спільного заголовка вручну у текстовому редакторі; Visual c + + не прямо редагувати його. У двох ресурс файлів MYSTRS.RC і MYMENUS.RC, ви вказуєте # включити MYSHARED.H у директивах лише для читання, для MYAPP.RC, командою набір включає файл, як описано вище.

Це найбільш зручний передбачати символ буде поділитися перед тим, як використовувати його, щоб визначити будь-який ресурс. Додати символ спільного заголовка файлу і, якщо ви не вже # include'd спільного заголовка файлу у директивах Read-Only для в.RC файлу, зробіть це перед використанням символ. Якщо ви не сподівався, обмін символ, таким чином, то вам доведеться вручну (за допомогою текстового редактора) перехід на # визначити заяву символу, скажімо, MYMENUS.H для MYSHARED.H перш ніж використовувати його в MYSTRS.RC.

Коли ви керуєте символи в декількох.RC файли, ви повинні також допомогти Visual C++, не слід призначати ж ID числові значення для різних ресурсів (символи). Для будь-якого огляду.RC файли, Visual C++ поступово призначає ідентифікатори у кожній з чотирьох областей ID. Між сеансами редагування, Visual C++ стежить за останній ID, його призначено в кожному з доменів у символу заголовка файлу для в.RC файли. Тут є те, що значення APS_NEXT для порожнього (новий).RC файли:

# визначити _APS_&NEXT_RESOURCE_VALUEnbsp; 101
# визначити _APS_NEXT_COMMAND_VALUE 40001
# визначити _APS_NEXT_CONTROL_VALUE 1000
# визначити _APS_NEXT_SYMED_VALUE 101

_APS_NEXT_RESOURCE_VALUE це значення наступний символ, який буде використовуватися для діалоговому ресурсу, ресурс меню і так далі. Припустимий діапазон значень символ ресурс є 1 до 0x6FFF.

_APS_NEXT_COMMAND_VALUE це значення наступного символ, який буде використовуватися для ідентифікації команди. Припустимий діапазон значень команду символ є 0x8000-0xDFFF.

_APS_NEXT_CONTROL_VALUE це значення наступного символ, який буде використовуватися для діалоговому контролю. Неприпустимий діапазон для діалоговому контролю символ значення є 8-0xDFFF.

_APS_NEXT_SYMED_VALUE є наступний символ значення, яке буде видано, якщо вручну призначити значення символу за допомогою нової команди в браузері символ.

Visual C++ починається з трохи вище значення, що найнижчі правового значення, коли створення нового.RC файли. AppWizard також буде ініціалізувати ці значення до чогось більш відповідним для MFC додатків. Щоб отримати додаткові відомості про ID значення діапазонів побачити технічне Примітка 20.

Тепер кожен раз, коли ви створюєте новий файл ресурсів, навіть в одному проекті, Visual C++, визначає однакові значення _APS_NEXT_ . Це означає, що якщо додати, скажімо, кратним діалоги у двох різних.RC файли, цілком імовірно що ж # визначити значення будуть призначені для різних діалогів. Наприклад, IDD_MY_DLG1 в першому.RC файли можуть бути призначені те ж саме кількість, 101, як IDD_MY_DLG2 в секунду.RC файли.

Щоб уникнути цього, ви повинні зарезервувати числовий діапазон для кожного з чотирьох областей ідентифікатори у відповідні.RC файли. Зробити це вручну з оновленням _APS_NEXT значення в кожному з в.RC файли перед додаванням ресурсів. Наприклад, якщо перший.RC файл використовує _APS_NEXT значень за промовчанням, а потім ви можете встановити такі параметри _APS_NEXT в секунду.RC файли:

# визначити _APS_&NEXT_RESOURCE_VALUEnbsp; 2000
# визначити _APS_NEXT_COMMAND_VALUE 42000
# визначити _APS_NEXT_CONTROL_VALUE 2000
# визначити _APS_NEXT_SYMED_VALUE 2000

Звичайно, це ще можливо, що Visual C++ буде призначити так багато ідентифікатори в перший.RC файл числові значення починають перекриватися тих, що для другого.RC файли. Ви повинні зарезервувати досить великі обсяги даних, так що це не відбудеться.

Управління залежності між.RC.CPP, і.Файли h

Коли зберігає Visual c + + є.RC файл, він також зберігає символом змін до відповідного РЕСУРСУ.H-файлу. Будь-який з ваших.CPP файли, що відносяться до ресурсів в регіоні.RC файли повинні # включити РЕСУРСУ.H-файлу, зазвичай зсередини ваш проект майстер заголовка файлу. Це призводить до небажаним побічним ефектом завдяки середовище розробки внутрішній проект управління, який сканує вихідних файлів для заголовка залежностей. Кожного разу, коли ви додаєте новий символ в Visual C++, всі в.CPP файл, що # включити РЕСУРСУ.H треба перекомпілювати.

Visual c + +, circumvents залежність від ресурсів.H, включаючи наступний коментар у першому рядку ресурсу.H-файлу:

 //{{NO_DEPENDENCIES}}

Середовище розробки інтерпретує цей коментар, ігноруючи зміни до РЕСУРСУ.Настільки, що залежать від H.CPP файли не треба перекомпілювати.

Visual C++ завжди додає до //{{NO_DEPENDENCIES}} коментарі лінію на.RC файли, коли вона зберігає файл. У деяких випадках обхід побудувати залежність від ресурсів.H може призвести до помилок під час виявлено під час компонування. Наприклад, якщо ви використовуєте браузер символ змінити числове значення, присвоєне символом для ресурсу, ресурс буде не бути правильно знайдено та завантажено на, якщо під час застосування в.Файл CPP, посилаючись на ресурс не перекомпілювати. У таких випадках ви повинні чітко відновити будь-який.CPP файли, які ви знаєте охоплених ресурсів, зміни символ.H або виберіть відновити всіх. Якщо у вас є необхідність часто змінювати параметри символів для певної групи ресурсів, ви напевно знайдете його більш зручним і безпечним вирватися ці символи в окремій лише для читання файл, як описано в розділі вище У тому числі додаткові файли заголовків.

Як Visual C++ вдається набір включає інформацію

Як зазначено вище, у меню Файл команду набір включає дозволяє вказати три типи відомостей:

Наступні описує, як Visual C++ підтримує цю інформацію в це.RC файли. Вам не потрібна ця інформація для використання Visual c + +, але вона може розширити ваше розуміння, так що ви більш впевнено функцію можна використовувати набір включає.

Кожен з вище три типи встановити включає в себе інформацію зберігається в регіоні.RC файли в двох формах: (1) як # включити або інші Директиви інтерпретується компілятором ресурс і (2) як спеціальні ресурси інтерпретується TEXTINCLUDE тільки на Visual c + +.

Метою TEXTINCLUDE ресурс є безпечно зберігати встановити включають інформацію у формі, що легко презентабельно в Visual C++ набір включає діалогового вікна. TEXTINCLUDE-це Тип ресурсів визначається Visual c + +. Visual c + + визнає три конкретні TEXTINCLUDE ресурсів, які мають ресурс ідентифікаційні номери, 1, 2 і 3:

TEXTINCLUDE ресурс ID. Тип інформації включає в себе набір
1 Символ заголовка файлу
2 Лише читання символ Директиви
3 Компіляції Директиви

Кожен з трьох видів набір включає в себе інформацію проілюстровано за замовчуванням MYAPP.RC і ресурсів.H файли, створені AppWizard, як описано нижче. Додаткові \0 і "" маркери між початок і кінець блоки вимагає RC синтаксис, щоб визначити нуль припинено рядків і символів подвійних лапок відповідно.

Символ заголовка файлу

Форма символу заголовка файлу інформації, інтерпретувати компілятором ресурс, це просто # включити заяви:

# включити "resource.h"

Відповідні TEXTINCLUDE ресурс:

1 TEXTINCLUDE DISCARDABLE
ПОЧАТИ
   # resource.h\0 "
КІНЕЦЬ

Лише читання символ Директиви

Лише читання символ директиви, включені у верхній частині MYAPP.RC у такому вигляді інтерпретується компілятором ресурс:

# включити "afxres.h"

Відповідні TEXTINCLUDE ресурс:

2 TEXTINCLUDE DISCARDABLE
ПОЧАТИ
   "# включити" "afxres.h""\r\n"
   "\0"
КІНЕЦЬ

Компіляції Директиви

Компіляції директиви, включені в кінці MYAPP.RC у такому вигляді інтерпретується компілятором ресурс:

#ifndef APSTUDIO_I&NVOKED
///////////////////////
//
/ / З TEXTINCLUDE 3
//
# включити "res\myapp.rc2"nbsp; / / non - Visual c + + редагувати ресурси

# включити "afxres.rc" / / стандартний компонентів
# включити "afxprint.rc" / / друк/друк перегляду ресурсів
#endif / / не APSTUDIO_INVOKED

#Ifndef APSTUDIO_INVOKED Директиви вказує Visual c + +, щоб пропустити компіляції Директиви.

Відповідні TEXTINCLUDE ресурс:

3 TEXTI&NCLUDE DISCARDABLE
ПОЧАТИ
"# включити" "res\myapp.rc2""nbsp; / / non - Visual c + + редакція resources\r\n "
"\r\n"
"# включити""afxres.rc" "/ / стандартний components\r\n"
"# включити""afxprint.rc" "/ / друк/друк попереднього resources\r\n"
"\0"
КІНЕЦЬ

Технічні примітки за номером |nbsp; Технічні примітки за категоріями

Index