• Бесплатный ВЕБИНАР по OSINT с Екатериной Тьюринг: ➡️9 февраля в 19:00 (мск) пройдет урок

    Как безопасно искать информацию в открытых источниках

    🔥 Записаться 🔥

Cimage и Cbitmap

  • Автор темы Автор темы micron
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
M

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 таким сложным.

Итак, кто-нибудь ПОМОГИТЕ иначе я спокойно не усну сегодня!
 
;) А, что ты используешь MFC или АTL? Тебе нужно получить bmp-ку из C:\....?
 
CImage::operator HBITMAP
Чем не подходит?

bitmap = CBitmap::FromHandle((HBITMAP)image);
 
CImage::operator HBITMAP
Чем не подходит?

bitmap = CBitmap::FromHandle((HBITMAP)image);

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


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

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

то программа работает правильно....хм..
 
Может дело в том, что я потом этот bitmap вставляю в CBrush? вот так:

CBrush brush = new CBrush(bitmap);
 
Можешь дальше искать телепатов или приведи текст ошибки и код который ее вызывает
 
Не знаю, о чем такая информация может сказать:

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
 
#define ASSERT_VALID(pOb) DEBUG_ONLY((::AfxAssertValidObject(pOb, THIS_FILE, __LINE__)))

Ты проверяешь результат ?
bitmap = CBitmap::FromHandle((HBITMAP)image);
 
из кода видно что не проверяю....

тем не менее bitmap != NULL, что еще надо проверять?
 
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.

Возможно поэтому
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!