• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

sdriver

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

Kmet

Well-known member
25.05.2006
904
8
BIT
0
CImage::eek:perator HBITMAP
Чем не подходит?

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

micron

CImage::eek:perator 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);

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

micron

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

CBrush brush = new CBrush(bitmap);
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Можешь дальше искать телепатов или приведи текст ошибки и код который ее вызывает
 
M

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
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
#define ASSERT_VALID(pOb) DEBUG_ONLY(:):AfxAssertValidObject(pOb, THIS_FILE, __LINE__)))

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

micron

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

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

Kmet

Well-known member
25.05.2006
904
8
BIT
0
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.

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

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