2017-12-04 21 views
2

実行中のアプリケーションのバージョンに応じて、リソースファイル内のコードを動的に変更したいと考えています。たとえば、メニューについてです。プリプロセッサディレクティブに基づいて異なるメニュー項目について説明したいと思います。私が持っている問題は、コードを追加することができるということです。しかし、リソースファイルを編集して保存すると、.apsファイルがプリプロセッサディレクティブを上書きします。どうすればこの問題を回避できますか?以下のコードは、私のリソーススクリプトに含まれているものの例です。MFC .rcファイルのMENU内でプリプロセッサディレクティブを使用するにはどうすればよいですか?

IDR_EXAMPLE_MENU MENU 
BEGIN 

/* 


Other Menu items 

*/ 

POPUP "&Help" 
BEGIN 
    MENUITEM "&Help Topics",    ID_HELP_FINDER 
    MENUITEM SEPARATOR 
#ifdef TEST_APP 
    MENUITEM "&About TEST...",    ID_APP_ABOUT 
#else 
    MENUITEM "&About RELEASE...",    ID_APP_ABOUT 
#endif 
    END 
END 

私はテストバージョンを実行している場合は、私は、メニュー項目に「TESTについて」を表示するようにしている場合RELEASEバージョンは私がのようなコードを追加することができますどのように 「RELEASEについて」を表示するためにそれをしたいと思い、それをしたいと思います.resファイルを.rcファイルを保存するときにプリプロセッサのディレクティブを上書きしなくても、これを自分のリソースファイルに保存できますか?

編集:This explains how files are affected by resource editing.

+0

あなたは、ID_APP_ABOUTMENU'永続的に "...&RELEASEについて" 二つの異なるコマンド 'MENUITEM "&TESTについて..."、ID_APP_ABOUTTEST'と' MENUITEMを持っている可能性があり、対応に動的にそれらのいずれかを削除し ' OnUpdate'ハンドラ。それはとても簡単です。これがオプションであれば教えてください。私はより完全な答えを書いていきます。これにより、VSリソースエディタを使用する場合に問題となるプリプロセッサコマンドの使用を完全に回避することができます。 –

+0

これは1つの可能な解決策かもしれません。コードベースのほとんどはプリプロセッサを使用していますので、他の場所でどのように処理されるかという理由だけで、そうすることができます。あなたが書きたいと思うなら、私は完全な答えを見るのが好奇妙です。 – sebenalern

+0

私はちょうどあなたがAの解決策を受け入れたのを見ました。私が以前のコメントで示唆したように、あなたがまだ答えに興味があるかどうか教えてください。 –

答えて

1

あなたが別々のrcファイルでコードを入れて、セットのCompile-Time Directivesフィールドがダイアログを含んで使用してそれらを含めることができます。 Using Multiple Resource Files in the Same Project

リソースが頻繁に変更されない場合は、リソースエディタで変更されていない.rc2ファイルに移動できます。プリプロセッサは自由に使用できます。

もう1つのオプションは、複数の.rcファイルを作成する(元の.rcファイルをコピーして残りのファイルを削除するなど)、条件付きで "Resource Includes ..> Compile-time directives"セクションに含めます。 .rcファイルに格納され、そのまま.rcファイルの最後に繰り返されます。

ResourcesDebug.rcのように2つの.RCファイルを作成します:

.... 

POPUP "&Help" 
BEGIN 
    MENUITEM "&Help Topics",    ID_HELP_FINDER 
    MENUITEM SEPARATOR 
    MENUITEM "&About TEST...",    ID_APP_ABOUT 
    END 
END 

.... 

ResourcesRelease.rc:あなたはあなたのレポに追加でき

.... 

POPUP "&Help" 
BEGIN 
    MENUITEM "&Help Topics",    ID_HELP_FINDER 
    MENUITEM SEPARATOR 
    MENUITEM "&About RELEASE...",    ID_APP_ABOUT 
    END 
END 

.... 

例えば

プロジェクトに追加する必要はありません。しかし、それらをプロジェクトに追加する場合は、それらをコンパイルから除外する必要があります。

コンパイル時ディレクティブ(リソースビュー>右クリック.RC):

#define _AFX_NO_SPLITTER_RESOURCES 
#define _AFX_NO_OLE_RESOURCES 
#define _AFX_NO_TRACKER_RESOURCES 
#define _AFX_NO_PROPERTY_RESOURCES 

#include "res\TestApp.rc2" // non-Microsoft Visual C++ edited resources 

#ifdef TEST_APP 
    #include ResourcesDebug.rc 
#else 
    #include ResourcesRelease.rc 
#endif 

.... 

いくつかのより多くのリンク:

+0

しかし、私はその新しいリソースファイルを編集しなければならないと仮定して、それを上書きしてプリプロセッサディレクティブを削除します。プリプロセッサディレクティブを保存したときに上書きされない場合は、同じ.rcファイルに置いても問題ありません。たぶん私は完全にあなたのソリューションを理解していない。あなたは精緻化できますか? – sebenalern

+0

これはうまくいった。私は、変更したくないすべてのものを.rc2ファイルに入れた。 – sebenalern

+0

動作しますが、維持するのが最も簡単です。 Visual Studioのリソースエディタ全体は、ちょっとしたコードです。 @ xMRiソリューションは面白く聞こえるが、試したことはない。 –

1

あなたがしたいですVSのリソースエディタを使用することができますが、それは生成する方法しか知りませんe 1種類の.rc出力であり、#defineの値は何もありません。あなたはそれを両方向に持つことはできません。コンパイラ指令を使用し、手作業で.rc(または.rc2)ファイルを編集するか、VSの出力を受け入れることができます。

リソースエディタを使用してVS内のファイルを編集し、.RCの一般的な内容を理解し、「希望」を再生成する後処理プログラムを作成する可能性があります。RCは生の内容をコンパイラ指令に置き換えます。それは可能ですが、トレードオフはアプリケーションにとって非常に重要です。

+0

代わりに、2つの異なる(しかし同様の)メニューリソース(IDR_EXAMPLE_TEST_MENU、IDR_EXAMPLE_RELEASE_MENU)をソースコードで使用し、コンパイラ指令を使用してIDR_EXAMPLE_TEST_MENU xorを使用します。IDR_EXAMPLE_RELEASE_MENU – franji1

3

リソースファイル内にeメニューのようなリソースを2回配置することもできます。

各リソースは、そのプロパティに条件を持つことができます。また、リソース内に同名のリソースを2回持つことができます。

enter image description here

あなたは最初のリソースに条件_DEBUGを追加することができます。それをコピーして_RELEASEという条件を与えてください。名前を同じIDに戻します。

enter image description here

+1

よく見えます。ここにMSDNフォーラムの投稿が掲載されています。実際の作業 - [リソースを含めるためのプリプロセッサディレクティブ](https://social.msdn.microsoft.com/Forums/vstudio/en-US/277177d0-0a25-4254-b58f- 5aa454deecd3/preprocessor-for-resource-inclusion?フォーラム= vcgeneral) –