Cimage и Cbitmap

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

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

    micron Гость

    В 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 Гость

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    CImage::eek:perator HBITMAP
    Чем не подходит?

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

    micron Гость

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

    micron Гость

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


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

    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 Гость

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

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

    Kmet Well-Known Member

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

    micron Гость

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

    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

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

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

    micron Гость

    из кода видно что не проверяю....

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    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.

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

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