リソースファイルに手動でダイアログをマージする方法

注意事項

この方法が推奨される方法かどうかは不明です。
自己責任で真似てください。

事前準備

  • ダイアログや画面パーツのIDが被っている箇所は先にダイアログエディタで修正しておく。
    • 後から被ってることがわかると大変面倒です。

マージ手順

  • マージ元のリソースファイル(〜.rc)のコードを開く
  • コードの「DESIGNINFO」の中のマージしたいダイアログの宣言をマージ元にコピペ。
////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
	// ここから
	ダイアログ名1, DIALOG
	BEGIN
		…
	END
	// ここまで
	
	ダイアログ名1, DIALOG
	BEGIN
		…
	END

	…

END
  • 同じく「Dialog」の中身もコピペ
////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

// ここから
IDD_DIALOG_〜 DIALOGEX 0, 0, 204, 106
STYLE 〜
CAPTION "ダイアログ1"
FONT 〜
BEGIN
	…
END
// ここまで
  • あと「menu」とか「stringTable」とかもあれば同じくコピペ。
  • ヘッダーファイル「Resource.h」より今回コピーしたいダイアログとパーツのIDをマージ元にコピー。
    • エディタでIDを変えた場合、変更前のIDも参照している場合があるので、それも持って行くこと。
  • コピーした後、IDを振り替えるが、以下の点に注意。
    • IDを変えた場合、変更前と変更後の#defineの値はそれぞれ同じにすること。
    • 追加した後、エディタが参照する next value も修正すること。
#define IDD_DIALOG〜			146

…

// Next default values for new objects
//
#ifdef APSTDIO_INVOKED
#ifndef APSTDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESORCE_VALUE		147	// これらの値を追加したIDの#defineの値+1にする
#define _APS_NEXT_COMMAND_VALUE 	32796
#define _APS_NEXT_CONTROL_VALUE 	1057
#define _APS_NEXT_SYMED_VALUE 		105
#endif
#endif


後はリビルドすれば上手くいくはず。

最後に経緯

他のプロジェクトで作成したMFCダイアログを別のプロジェクトにマージする必要ができた。
単にリソースファイルをコピーするだけでは上手くいかず、また、1つのプロジェクトに複数のリソースを持つのも、今後エディタでいじるときに、いやな予感がする。
人に聞いてみたところ、普通はマージ先のリソースファイルに手動で移すとのこと。
やってみたらできたのでその方法をメモ。


MFCのダイアログのリソースはマクロだらけでもう別言語みたいね。


そんな感じ。