• Codeby web-security - Курс "Тестирование Веб-Приложений на проникновение с нуля" от команды codeby. Общая теория, подготовка рабочего окружения, пассивный фазинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое. Подробнее ...

  • Мобильный клиент нашего форума для Android гаджетов доступен в Google Play Market по этой ссылке. Клиент можно скачать с нашего форума по этой ссылке. Последняя версия МК в нашем телеграм канале вот здесь

Cimage и Cbitmap

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

micron

#1
В 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

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

Kmet

Java Team
25.05.2006
1 036
8
#3
CImage::eek:perator HBITMAP
Чем не подходит?

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

micron

#5
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

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

CBrush brush = new CBrush(bitmap);
 

Kmet

Java Team
25.05.2006
1 036
8
#7
Можешь дальше искать телепатов или приведи текст ошибки и код который ее вызывает
 
M

micron

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

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

Java Team
25.05.2006
1 036
8
#9
#define ASSERT_VALID(pOb) DEBUG_ONLY(:):AfxAssertValidObject(pOb, THIS_FILE, __LINE__)))

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

micron

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

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

Kmet

Java Team
25.05.2006
1 036
8
#11
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.

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