msvc++ - ресурсы(

Тема в разделе "LANGS.C", создана пользователем sometime, 23 июн 2009.

  1. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    трабла такая не знаю я толи загружать в ресурсы не умею, толи доставать с них не получается - объясните плз - третий день далблюсь и никак((((

    Суть такая - есть бмп её надо нарисовать на моем окне (graphics.DrawImage). Чтобы картинку не таскать в отдельном файле - решил в ресурсы её засунуть. Засунул( не знаю правильно ли) - FindResource+LoadResource все норм грузят в память мне картинку,но без заголовка bmp-шного. Так как хочу её потом вывести надо бы мне её в Bitmap отправить делаю ето с помощью Gdiplus::Bitmap.FromResource- не лоадит(( пробовал сначала загрузить в память,сделать стрим, ну и загрузить с помощью Gdiplus::Bitmap.FromStream - тож самое - возвращает "0". Не подскажите как с етим боротся?)

    Вообщем мнение мое такое что ето изза того что заголовка нету в бмп и просто ГДИ теряется - не знает что за бмп у меня там...Думал загрузить в ресурсы не как bmp а как rawdata,но нету в VC++ такого или я просто не знаю....

    хелп!
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    sometime
    > как rawdata
    Ключевое слово RCDATA.

    Хочешь внятных комментариев - покажи код.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    LockResource
     
  4. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    щас вот так - тож не пашет((
    Код (Text):
    1. pBitmap LoadImageFromResource(UINT res, LPCTSTR pType, HMODULE hInst, Gdiplus::Image **image)
    2. {
    3.     HRSRC hResource = ::FindResource(hInst, MAKEINTRESOURCE(res), pType);
    4.     if (!hResource){
    5.         return false;
    6.     }
    7.     DWORD imageSize = ::SizeofResource(hInst, hResource);
    8.     if (!imageSize)
    9.         return false;
    10.     const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource));
    11.     if (!pResourceData)
    12.         return false;
    13.     HGLOBAL hBuffer  = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
    14.     if (hBuffer)
    15.     {
    16.         void* pBuffer = ::GlobalLock(hBuffer);
    17.         if (pBuffer)
    18.         {
    19.             CopyMemory(pBuffer, pResourceData, imageSize);
    20.             IStream* pStream = NULL;
    21.             if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
    22.             {
    23.                 *image = Gdiplus::Image::FromStream(pStream);
    24.             }
    25.             ::GlobalUnlock(hBuffer);
    26.         }
    27.         ::GlobalFree(hBuffer);
    28.         hBuffer = NULL;
    29.     }
    30.     return (pBitmap)*image;
    31. }
    32. pBitmap LoadResources( HINSTANCE hInstance, LPSTR Name )
    33. {
    34.     Gdiplus::Image* img;   
    35.     return LoadImageFromResource( 102, _T("BITMAP"), hInstance, &img);
    36. }
    а когда писал было примерно так:

    Gdiplus::Bitmap *bmp = new Gdiplus::Bitmap();
    bmp.FromRecources( hInst, L"#102" );

    и возвращает 0...а примерно потому что код вытер уже предыдущий,но он мне больше нравился - меньше манёвров прии непосредственной загрузке картинки с ресурсов в битмап. ЛокРесурс в старом варианте не пробовал,но тут он тож не меняет погоды((
     
  5. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    а как тогда мне создавать файл ресурсов? - вручную-как?
    а то при помощи VC - нету там такого поля....я про вариант,когда справа покликать Recource Files->Add->New Item ...
     
  6. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Вручную?
    Добавляешь в проект файл "foo.rc". Содержимое файла:
    Код (Text):
    1. #define MY_IMAGE_TYPE                   513
    2. #define MY_IMAGE_ID                     1
    3.  
    4. MY_IMAGE_ID           MY_IMAGE_TYPE           "image_file.bmp"
    ID – любой. TYPE – такой, чтобы не было конфликтов с уже существующими.
    Всё, дальше студия сама должна ресурсы скомпилить и слинковать.


    А вообще у Gdiplus::Image есть метод FromStream. IStream & Resources.
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    sometime #4
    Код с CodeProject: Loading JPG & PNG resources using GDI+?
    Он не работает?
    Смотри в отладчике какая из функций завершилась ошибкой, анализируй код ошибки.


    > как тогда мне создавать файл ресурсов? ... при помощи VC
    Под студией не подскажу, у меня только express edition, там нет редактора ресурсов.
    А руками просто
    Код (Text):
    1. /* файл целиком */
    2. IDR_RCDATA_WAV RCDATA "Sample.wav"
    3. /* просто строка */
    4. SIMPLEDATA RCDATA { "simple data\n\0" }
     
  8. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    код на самом деле с винграда, мне там посоветовали сделать так:)
    -и в конце концов взяли прожект и редактнули - все гуд!

    и вам спасибо! - теперь знаю основные положения в создании рес файлов.)
    вот рабочий кодец:
    Код (Text):
    1. Image* LoadImageFromResource(UINT res, LPCTSTR pType, HMODULE hInst, Gdiplus::Image **image)
    2. {
    3.     HRSRC hResource = ::FindResource(hInst, MAKEINTRESOURCE(res), pType);
    4.     if (!hResource){
    5.         return false;
    6.     }
    7.     DWORD imageSize = ::SizeofResource(hInst, hResource);
    8.     if (!imageSize)
    9.         return false;
    10.     const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource));
    11.     if (!pResourceData)
    12.         return false;
    13.     HGLOBAL hBuffer  = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
    14.     if (hBuffer)
    15.     {
    16.         void* pBuffer = ::GlobalLock(hBuffer);
    17.         if (pBuffer)
    18.         {
    19.             CopyMemory(pBuffer, pResourceData, imageSize);
    20.             IStream* pStream = NULL;
    21.             if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
    22.             {
    23.                 (*image) = Gdiplus::Image::FromStream(pStream);
    24.                 DWORD dw = GetLastError();
    25.            }
    26.             ::GlobalUnlock(hBuffer);
    27.         }
    28.         ::GlobalFree(hBuffer);
    29.         hBuffer = NULL;
    30.     }
    31.     return *image;
    32. }
    33. Image* LoadResources( HINSTANCE hInstance, LPSTR Name )
    34. {
    35.  
    36.     Gdiplus::Image* img;
    37.     return LoadImageFromResource( IDB_PNG_TEST, _T("PNG") , hInstance, &img);
    38. }
    как всегда - минимальные ошибки кодера приводят к максимальным потерям времени:)
     
  9. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    Не знаю что скрывается под определением "рабочий кодец", но interface leak в нем присутствует.