Каков самый простой способ отобразить (и изменить) ресурс изображения в диалоговом окне WPF (с использованием C++/CLI)?

У меня есть приложение с графическим интерфейсом C++/CLI, и я хочу отобразить изображение в качестве наглядного пособия, чтобы пользователь мог видеть, на каком этапе процедуры он находится. Это изображение нужно будет менять каждый раз, когда пользователь выбирает новый шаг.

В настоящее время я использую ящик с изображениями, и во время выполнения с диска загружается изображение. Итак, есть несколько вещей, которые мне нужно знать здесь:

  1. Лучше всего использовать для этой цели окно с изображением или есть другой элемент управления, который лучше подходит?
  2. Как встроить изображения в исполняемый файл и загрузить их оттуда вместо файла, который существует на диске.
  3. Как мне загрузить новое изображение (я предполагаю, что это будет довольно очевидно, если я смогу взломать пункт 2)?

Я видел несколько ответов, относящихся к С#, но я не видел ничего, что выглядело бы так, будто это переводит что-то в приложение С++/CLI. Любые предложения будут очень приветствоваться.


person Jon Cage    schedule 14.10.2009    source источник


Ответы (1)


Что ж, это может быть не лучшее решение, но следующее работает.

Создайте новый Windows Forms Application

Добавьте эти библиотеки в настройки компоновщика (Project Proerties -> Link -> Input -> Additional Dependencies):

User32.lib Gdi32.lib

Добавьте эти заголовки:

#include <windows.h>
#include "resource.h"

Добавьте эти пространства имен:

using namespace System::Reflection;
using namespace System::Runtime::InteropServices;

Добавьте к своим ресурсам пару растровых изображений и назовите их IDB_BITMAP1 и IDB_BITMAP2.

Добавьте поле с изображением под названием m_pictureBox1.

Добавьте кнопку и дважды щелкните кнопку, чтобы добавить обработчик нажатия:

System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
    // Remove any previously stored images
    if(m_pictureBox1->Image != nullptr)
    {
        delete m_pictureBox1->Image;
    }

    // Pick a new bitmap
    static int resource = IDB_BITMAP1;
    if( resource == IDB_BITMAP2)
    {
        resource = IDB_BITMAP1;
    }
    else
    {
        resource = IDB_BITMAP2;
    }

    // Get the primary module
    Module^ mod = Assembly::GetExecutingAssembly()->GetModules()[0];

    // Get the instance handle 
    IntPtr hinst = Marshal::GetHINSTANCE(mod);

    // Get the bitmap as unmanaged
    HANDLE hbi = LoadImage((HINSTANCE) hinst.ToPointer(),MAKEINTRESOURCE(resource),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR); 

    // import the unmanaged bitmap into the managed side 
    Bitmap^ bi = Bitmap::FromHbitmap(IntPtr(hbi));

    // insert the bitmap into the picture box
    m_pictureBox1->Image = bi;

    // Free up the unmanaged bitmap
    DeleteObject(hbi);

    // Free up the instance and module
    delete hinst;
    delete mod;
}

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

person Jon Cage    schedule 14.10.2009
comment
извини, Джон, но я новичок в С++, и я хочу знать, как добавить файлы в ресурсы, есть ли код, который я должен написать? - person Sara S.; 26.10.2012
comment
В окне Resources щелкните правой кнопкой мыши и выберите Add -> Resource ->Bitmap, затем нажмите Import..., чтобы выбрать файл, который вы хотите импортировать. - person Jon Cage; 29.10.2012