трабла такая не знаю я толи загружать в ресурсы не умею, толи доставать с них не получается - объясните плз - третий день далблюсь и никак(((( Суть такая - есть бмп её надо нарисовать на моем окне (graphics.DrawImage). Чтобы картинку не таскать в отдельном файле - решил в ресурсы её засунуть. Засунул( не знаю правильно ли) - FindResource+LoadResource все норм грузят в память мне картинку,но без заголовка bmp-шного. Так как хочу её потом вывести надо бы мне её в Bitmap отправить делаю ето с помощью Gdiplus::Bitmap.FromResource- не лоадит(( пробовал сначала загрузить в память,сделать стрим, ну и загрузить с помощью Gdiplus::Bitmap.FromStream - тож самое - возвращает "0". Не подскажите как с етим боротся?) Вообщем мнение мое такое что ето изза того что заголовка нету в бмп и просто ГДИ теряется - не знает что за бмп у меня там...Думал загрузить в ресурсы не как bmp а как rawdata,но нету в VC++ такого или я просто не знаю.... хелп!
щас вот так - тож не пашет(( Код (Text): pBitmap LoadImageFromResource(UINT res, LPCTSTR pType, HMODULE hInst, Gdiplus::Image **image) { HRSRC hResource = ::FindResource(hInst, MAKEINTRESOURCE(res), pType); if (!hResource){ return false; } DWORD imageSize = ::SizeofResource(hInst, hResource); if (!imageSize) return false; const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource)); if (!pResourceData) return false; HGLOBAL hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize); if (hBuffer) { void* pBuffer = ::GlobalLock(hBuffer); if (pBuffer) { CopyMemory(pBuffer, pResourceData, imageSize); IStream* pStream = NULL; if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK) { *image = Gdiplus::Image::FromStream(pStream); } ::GlobalUnlock(hBuffer); } ::GlobalFree(hBuffer); hBuffer = NULL; } return (pBitmap)*image; } pBitmap LoadResources( HINSTANCE hInstance, LPSTR Name ) { Gdiplus::Image* img; return LoadImageFromResource( 102, _T("BITMAP"), hInstance, &img); } а когда писал было примерно так: Gdiplus::Bitmap *bmp = new Gdiplus::Bitmap(); bmp.FromRecources( hInst, L"#102" ); и возвращает 0...а примерно потому что код вытер уже предыдущий,но он мне больше нравился - меньше манёвров прии непосредственной загрузке картинки с ресурсов в битмап. ЛокРесурс в старом варианте не пробовал,но тут он тож не меняет погоды((
а как тогда мне создавать файл ресурсов? - вручную-как? а то при помощи VC - нету там такого поля....я про вариант,когда справа покликать Recource Files->Add->New Item ...
Вручную? Добавляешь в проект файл "foo.rc". Содержимое файла: Код (Text): #define MY_IMAGE_TYPE 513 #define MY_IMAGE_ID 1 MY_IMAGE_ID MY_IMAGE_TYPE "image_file.bmp" ID – любой. TYPE – такой, чтобы не было конфликтов с уже существующими. Всё, дальше студия сама должна ресурсы скомпилить и слинковать. А вообще у Gdiplus::Image есть метод FromStream. IStream & Resources.
sometime #4 Код с CodeProject: Loading JPG & PNG resources using GDI+? Он не работает? Смотри в отладчике какая из функций завершилась ошибкой, анализируй код ошибки. > как тогда мне создавать файл ресурсов? ... при помощи VC Под студией не подскажу, у меня только express edition, там нет редактора ресурсов. А руками просто Код (Text): /* файл целиком */ IDR_RCDATA_WAV RCDATA "Sample.wav" /* просто строка */ SIMPLEDATA RCDATA { "simple data\n\0" }
код на самом деле с винграда, мне там посоветовали сделать так -и в конце концов взяли прожект и редактнули - все гуд! и вам спасибо! - теперь знаю основные положения в создании рес файлов.) вот рабочий кодец: Код (Text): Image* LoadImageFromResource(UINT res, LPCTSTR pType, HMODULE hInst, Gdiplus::Image **image) { HRSRC hResource = ::FindResource(hInst, MAKEINTRESOURCE(res), pType); if (!hResource){ return false; } DWORD imageSize = ::SizeofResource(hInst, hResource); if (!imageSize) return false; const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource)); if (!pResourceData) return false; HGLOBAL hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize); if (hBuffer) { void* pBuffer = ::GlobalLock(hBuffer); if (pBuffer) { CopyMemory(pBuffer, pResourceData, imageSize); IStream* pStream = NULL; if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK) { (*image) = Gdiplus::Image::FromStream(pStream); DWORD dw = GetLastError(); } ::GlobalUnlock(hBuffer); } ::GlobalFree(hBuffer); hBuffer = NULL; } return *image; } Image* LoadResources( HINSTANCE hInstance, LPSTR Name ) { Gdiplus::Image* img; return LoadImageFromResource( IDB_PNG_TEST, _T("PNG") , hInstance, &img); } как всегда - минимальные ошибки кодера приводят к максимальным потерям времени