2

外部の .gif 画像ファイルを使用し、何らかの処理後に別の画像ファイルを生成する C++ (特に MFC) クラスを作成しています。何とか初期画像をコードに埋め込むことができればいいのですが。複数の .rc ファイルの使用について MSDN を読みましたが、全体が非常に複雑に思えます。

この問題を処理する前にこれを経験した人から知りたいです。

編集:申し訳ありませんが明確ではありませんでした。私が書いているクラスはスタンドアロンである必要があるため、再び使用できます。画像をリソース ファイルに入れると、新しいプロジェクトで使用するとクラスがコンパイルされません。

4

6 に答える 6

1

ソリューション エクスプローラーでリソース ビューに移動し、右クリックしてクリックし、gif ファイルをAdd Resourceクリックして追加します。を使用して、コード内の gif ファイルにアクセスImportできるようになりました。Resource ID

于 2012-08-01T04:16:15.143 に答える
1

クラスまたは同様の C++ コンテナー内に MFC リソースを埋め込むことはできません。それらは、生成されたバイナリの別のセクションで、DLL または EXE ファイルにのみ埋め込むことができます。クラスを再利用可能にしたいので、それを DLL に入れる必要があります。したがって、AFX_EXT_CLASSキーワードを使用してクラスにタグを付ける必要があります。

解決策は 2 つあります。

解決策 1:

  • MFC DLL プロジェクトを作成します ( MFC Extension DLL)。それを呼び出すMyLibraryか、何でもします。
  • すべてのスタンドアロン クラスをこの DLL に入れます。
  • 必要なすべてのリソースを組み込みます。
  • HINSTANCE以下で説明するように、クラスが DLLからリソースをロードできるようにします。

HINSTANCEDLLの を取得するには、いくつかの方法があります。あなたが私に尋ねるなら、最善の解決策はそれをつかむことですDllMain. MFC Extension DLL構成を選択すると、これは自動的に行われます。

static AFX_EXTENSION_MODULE MyLibDLL = { NULL, NULL }; // Make this variable global!
// Then access the hInstance as follows:
LoadResource(MyLibDLL.hModule, ...)

解決策 2:

リソースをバイト バッファーとして格納します。または、 Base64に変換してASCII 文字列として保存することをお勧めします。ただし、スタックを吹き飛ばさないように注意してください。リソースを小さく保つか、プロジェクト設定でスタック サイズを増やしてください。例:

const char *encodedResource = "SGVsbG8gd29ybGQh";
char *data = decode(encodedResource);
foo(data);
于 2012-08-14T09:00:20.850 に答える
0

クラスを使用するには、特定の .gif ファイルをプロジェクトにインポートし、特定の予想される識別子 (IDB_MYCLASS_MYGIF など) を指定する必要があることを文書化するのが最善の解決策だと思います。その後、プリプロセッサを使用して、リソースが正しく追加されたかどうかを検出できます。次に例を示します。

#ifndef IDB_MYCLASS_MYGIF
    #error Make sure you import mygif.gif to the project.  See docs for more info.
#endif

これにより、ユーザーがイメージを適切にインポートするまで、クラスのコンパイルが妨げられます。または、 #ifdefs を使用して、デフォルトの画像が提供されていない場合、それを使用しないコードにフォールバックすることもできます。

于 2012-08-13T14:03:28.530 に答える
0

Just adding the file to a resource doesn't embed the file in the actual resource file it just links to the file. If you open your .rc file you'll see it says something like:

IDB_GIF_MYIMAGE     GIF     "artwork\\mygif.gif"

During the compilation face the resource will be included in the EXE, which you reference using the resource id IDB_GIF_MYIMAGE. You can reference the same file in other projects without having to duplicate the file.

于 2012-08-03T11:05:12.140 に答える
0

http://www.codeproject.com/Articles/5371/ToDoList-6-5-4-Feature-Release-An-effective-and-flに示されている CRuntimeDialog クラスを見てください。リソース定義を構成する文字列からダイアログを作成する方法を提供します。

于 2012-08-15T14:36:03.653 に答える
0

リソース ファイルを使用せずに画像 (またはその他の種類のバイナリ データ) をクラスに埋め込むには、bin2c ユーティリティを使用します。たとえば、 http ://www.opensource.apple.com/source/libpcap からダウンロードできます。 /libpcap-16/libpcap/msdos/bin2c.c . これをファイルで実行すると、基本的にはファイルのバイトをその配列のメンバーとして持つ静的配列が生成されます。この配列を .h ファイルに詰め込む (または、クラスのヘッダーに入れるか、静的メンバーにする...) と、 LoadResource() とその兄弟を使用しなくても、そのファイルをメモリ内で使用できるようになります。 .

これを CImage::Load() で使用する場合は、IStream から派生する独自のクラスを記述し、メモリから「読み取る」方法でいくつかのメソッドを実装する必要があります。CImage で gif ファイルのメモリ内表現から画像をデコードする方法がわかりません。

于 2012-08-08T14:24:01.793 に答える