Почему я не могу загрузить ресурс изображения из моего файла resx? - PullRequest
0 голосов
/ 19 июля 2010

У меня есть библиотека элементов управления, в которую я добавил файл .resx (ImageResources.resx). Он содержит два изображения .png, которые я впоследствии добавил.

В той же библиотеке у меня есть элемент управления, который загружает пару изображений для создания какого-либо пользовательского чертежа, но я не могу загрузить ресурсы:

void GTableLayoutPanel::SetBorderImagesFromManifest(String^ topLeftCornerImageName, String^ topImageName)
{
    // Grab the assembly this is being called from
    Assembly^ assembly = Assembly::GetExecutingAssembly();

    // Grab the images from the assembly
    Stream^ stream = assembly->GetManifestResourceStream(topLeftCornerImageName);
    Image^ topLeftImage = System::Drawing::Image::FromStream(stream);
    stream = assembly->GetManifestResourceStream(topImageName);
    Image^ topImage = System::Drawing::Image::FromStream(stream);

    // Update the internal store from the supplied images
    SetBorderImages(topLeftImage, topImage);
}

... дает мне ошибки, жалуясь на то, что stream имеет значение null, что говорит о том, что мой вызов на GetManifestResourceStream завершается неудачно.

Изображения называются group_box_top.png и group_box_top_left.png, и я вызываю загрузчик изображений следующим образом:

SetBorderImagesFromManifest("group_box_top_left.png", "group_box_top.png");

Я также пробовал:

SetBorderImagesFromManifest("group_box_top_left", "group_box_top");

... потому что файлы появляются в файле .resx без расширений .png, но выдает ту же ошибку.

Я пропустил здесь шаг?

[Редактировать] Я попробовал предложение в этой последней ссылке, и я получил:

MyControlsLib.ImageResources.resources

Итак, я попробовал ссылки:

Stream^ strm1 = assembly->GetManifestResourceStream("MyControlsLib.ImageResources.resources.group_box_top_left");
Stream^ strm2 = assembly->GetManifestResourceStream("MyControlsLib.ImageResources.resources.group_box_top_left.png");
Stream^ strm3 = assembly->GetManifestResourceStream("MyControlsLib.ImageResources.group_box_top_left");
Stream^ strm4 = assembly->GetManifestResourceStream("MyControlsLib.ImageResources.group_box_top_left.png");

... все из которых возвращают nullptr: - /

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Я наконец-то получил волшебную комбинацию для решения C ++ / CLI.Так что на случай, если у кого-то еще есть эта проблема:

Метод 1 (через файл .resx)

  1. Добавьте файлы изображений (я использовал .pngs, но растровые изображения и т. Д. Тоже работают).
  2. Добавить файл ресурса:
    1. Перейти в обозреватель решений.
    2. Щелкните правой кнопкой мыши Resource Files в проекте, который вы добавляете в
    3. Выберите Add> New Item..
    4. Выберите Visual C++> Resource> Assembly Resource File (.resx).Я назвал мой «ImageResources.resx»
  3. Добавьте изображения:
    1. Дважды щелкните «ImageResources.resx» в обозревателе решений
    2. Нажмите наAdd Resource и выберите Add Existing File...
    3. Выберите изображения для встраивания.Я добавил group_box_top.png и group_box_top_left.png, которые отображаются в файле .resx как group_box_top и group_box_top_left.

Затем вы можете получить изображения из манифеста с помощью:

// Grab the assembly this is being called from
Assembly^ assembly = Assembly::GetExecutingAssembly();
AssemblyName^ assemblyName = assembly->GetName();

// Grab the images from the assembly
ResourceManager^ rm = gcnew ResourceManager(assemblyName->Name+".ImageResources", assembly);
Bitmap^ topLeftImage = (Bitmap^)rm->GetObject("group_box_top_left");
Bitmap^ topImage = (Bitmap^)rm->GetObject("group_box_top");

Обратите внимание, что строка ImageResources, переданная в конструктор ResourceManager, должна соответствовать имени вашего файла .resx.

Метод 2 (через компоновщик)

  1. Добавьте файлы:
    1. Щелкните правой кнопкой мыши свой проект
    2. Перейдите на Linker -> Input
    3. Добавьте файлы, которые вы хотите встроитьдо свойства Embed Managed Resource File.Я добавил PingSend.wav здесь.

Чтобы получить доступ к файлам, просто выполните:

System::Reflection::Assembly^ assembly = Assembly::GetExecutingAssembly();
System::Media::Sonudplayer^ pingPlayer = gcnew System::Media::SoundPlayer(assembly->GetManifestResourceStream("PingSend.wav"));

.. который в этом случае загружает аудиофайл готов к воспроизведению.

1 голос
/ 19 июля 2010

Я думаю, что путь к элементу ресурса, возможно, должен быть полностью определен:

GetManifestResourceStream("MyNamespace.ImageResources.group_box_top_left")

Эта ссылка показывает пример C # (извините), обратите внимание, что при создании потока он имеет пространство имен в параметрах:

http://support.microsoft.com/kb/319292

Здесь также рассказывается, как найти полный путь к ресурсу:

Как мне найти «путь» встроенногоресурс

...