1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Cimage и Cbitmap

Тема в разделе "С и С++", создана пользователем micron, 24 авг 2006.

Статус темы:
Закрыта.
  1. micron

    micron Гость

    Репутация:
    0
    В MFC есть два замечательных класса: CImage и CBitmap.

    Внимание вопрос: как получить указатель на объект CBitmap из объекта CImage?

    Промучившись несколько часов я нашел пока только 2 варианта:

    1.

    image = new CImage();
    image->Load("C:\....");
    CBitmap *bitmap;
    bitmap->CreateBitmap(image->GetWidth(),image->GetHeight(),1,image->GetBPP(),image->GetBits());

    Извращенческий способ, но он не подходит..Компилируется все успешно, но уже при запуске программы выскакивает жуткое исключение и ВСЕ!


    2.
    image = new CImage();
    image->Load("C:\....");
    CBitmap *bitmap;
    bitmap = CBitmap::FromHandle(image->m_hBitmap);

    Этот вариант так же не катит, так как еще на стадии компиляции компилятор орет, что поле m_hBitmap ну никак нельзя получить в открытую. ибо оно закапсулировано так, что и сам господь Бог видно не достанет. (Вот текст ошибки в оригинале: c:mfcTestsimpwin.cpp(97): error C2248: 'ATL::CImage::m_hBitmap': Kein Zugriff auf private Element, dessen Deklaration in der Klasse "ATL::CImage" erfolgte )

    Была умопомрачительная идея сделать потомка от CImage и таки выдернуть из него уже это поле (если оно конечно protected, а не private), но такой вариант кажеьтся малоперспективным - сомневаюсь, что разработчики MFC сделали получение CBitmap таким сложным.

    Итак, кто-нибудь ПОМОГИТЕ иначе я спокойно не усну сегодня!
     
  2. sdriver

    sdriver Гость

    Репутация:
    0
    ;) А, что ты используешь MFC или АTL? Тебе нужно получить bmp-ку из C:\....?
     
  3. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    CImage::operator HBITMAP
    Чем не подходит?

    bitmap = CBitmap::FromHandle((HBITMAP)image);
     
  4. micron

    micron Гость

    Репутация:
    0
    использую MFC...Имя и путь файла я опустил..он ведь не имеет значение.
     
  5. micron

    micron Гость

    Репутация:
    0
    Это почему то не работает...компилируется нормально....но вылетает ошибка при запуске ..


    Если для того же кода использую

    hBitmap = (HBITMAP)LoadImage(NULL, "C:\\MGames\\mfcTest\\bg171.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
    bitmap->Attach(hBitmap);

    то программа работает правильно....хм..
     
  6. micron

    micron Гость

    Репутация:
    0
    Может дело в том, что я потом этот bitmap вставляю в CBrush? вот так:

    CBrush brush = new CBrush(bitmap);
     
  7. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    Можешь дальше искать телепатов или приведи текст ошибки и код который ее вызывает
     
  8. micron

    micron Гость

    Репутация:
    0
    Не знаю, о чем такая информация может сказать:

    Debug Assertion Failed!
    File: wingdi.cpp
    Line: 1066


    Реально эта ошибка проиходит в конструкторе класса CBrush:

    CBrush::CBrush(CBitmap* pBitmap)
    {
    ASSERT_VALID(pBitmap);

    if (!Attach:):CreatePatternBrush((HBITMAP)pBitmap->m_hObject)))
    AfxThrowResourceException();
    }

    в строчке ASSERT_VALID(pBitmap);

    При вем этом не понятно почему этот код работает:

    HBITMAP hBitmap = NULL;
    hBitmap = (HBITMAP)LoadImage(NULL, "C:\\MGames\\mfcTest\\bg171.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);

    CBitmap *bitmap = CBitmap::FromHandle(hBitmap);
    CBrush brush = new CBrush(bitmap);


    а вот этот нет:

    CImage *image = new CImage();
    image->Load("C:\\MGames\\mfcTest\\bg171.bmp");

    CBitmap *bitmap = CBitmap::FromHandle((HBITMAP)image);
    CBrush brush = new CBrush(bitmap);

    :lol: :D :lol: :D :P
     
  9. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    #define ASSERT_VALID(pOb) DEBUG_ONLY(:):AfxAssertValidObject(pOb, THIS_FILE, __LINE__)))

    Ты проверяешь результат ?
    bitmap = CBitmap::FromHandle((HBITMAP)image);
     
  10. micron

    micron Гость

    Репутация:
    0
    из кода видно что не проверяю....

    тем не менее bitmap != NULL, что еще надо проверять?
     
  11. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    static CBitmap* PASCAL FromHandle(
    HBITMAP hBitmap
    );

    Remarks
    If a CBitmap object is not already attached to the handle, a temporary CBitmap object is created and attached. This temporary CBitmap object is valid only until the next time the application has idle time in its event loop, at which time all temporary graphic objects are deleted. Another way of saying this is that the temporary object is only valid during the processing of one window message.

    Возможно поэтому
     
Статус темы:
Закрыта.

Поделиться этой страницей