Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразование CBitmap в HBITMAP и обратно  (Прочитано 13949 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 04-08-2004 09:46 » 

Возникла необходимость преобразовать CBitmap в HBITMAP но все оказалось не так просто как казалось вначале
Пробовал:

HBITMAP hBMP=(HBITMAP)*pBitmap;
CBitmap BMP;
BMP.Detach();
BMP.Attach(hBMP);

CBitmap BMP;
BMP.Detach();
BMP.Attach(pBitmap->m_hObject);

HBITMAP hBMP=(HBITMAP)pBitmap->m_hObject;
CBitmap BMP;
BMP.Detach();
BMP.Attach(hBMP);

HBITMAP hBMP=(HBITMAP)pBitmap->m_hObject;
CBitmap BMP;
BMP.FromHandle(hBMP);

Ну не работает((((
На экране вместо битмапа белый квадрат

Может кто подобное уже делал?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 04-08-2004 11:05 » 

Делал,
Цитата

HBITMAP hBMP=(HBITMAP)pBitmap->m_hObject;
CBitmap BMP;
BMP.FromHandle(hBMP);

Это должно работать...
Возмоджно у тебя вывод самой битмапки неверно устроен.
Воспроизведи полный код - где и что ты делаешь....
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 04-08-2004 11:09 » 

Цитата

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.



В вольном переводе означает, что если ты делаешь FromHandle то объект CBitmap должен быть создан иначе он пропадет сразу же после переключения контекста.

В общем что у тебя видимо и происходит.
Вначале создаешь битмапный объект CreteCompatibleBitmap.
Записан

А птичку нашу прошу не обижать!!!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 04-08-2004 11:22 » 

USBLexus,  Согласно MSDN MFC-GDI объекты не требуют явного кастинга в хэндлы у них уже есть встроенный кастниг-оператор.

Each graphic-object class in the class library has a cast operator that will cast an MFC object to the associated Windows handle. The resulting handle is valid until the associated object detaches it.

Насколько я помню, пользовался ими просто так и всё работало. Может где в другом месте запарка?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 05-08-2004 06:44 » 

У меня Bitmap лежит в DLL, когда я из dll передаю CBitmap* а в программе делаю

ToolCtrl->AddBitmap(1,pCBitmap);//Добавляю битмап в ImageList контролатулбара

то все работает нормально

Стоит передать HBITMAP как работать наотрез перестает  Жаль  Вместо битмапа белый квадрат

Вот полный код:

void CDynToolBar::AddButton(CBitmap* pBitmap)
//
//Добавление кнопки в тулбар
//
{
HBITMAP hBMP=(HBITMAP)*pBitmap;
CBitmap BMP;
BMP.Detach();
BMP.Attach(pBitmap->m_hObject);
//BMP.FromHandle(hBMP);

CToolBarCtrl* ToolCtrl=&m_pToolBar->GetToolBarCtrl();//Получаем контрол
 int nButCount = ToolCtrl->GetButtonCount();//Определяем количество кнопок
 // ToolCtrl->AddBitmap(1, pBitmap);//Подключаем нашу картинку
ToolCtrl->AddBitmap(1,&BMP);
  int nImageCount = ToolCtrl->GetImageList()->GetImageCount();//Определяем число картинок в тулбаре
    //Создаем новую кнопку
   TBBUTTON tb;
  tb.iBitmap = nImageCount-1;
 tb.idCommand = DTB_IDD_BUTTONS;
tb.fsState = TBSTATE_ENABLED;
 tb.fsStyle = TBSTYLE_BUTTON;
  tb.dwData = 0;
   tb.iString = NULL;
    ToolCtrl->InsertButton(nButCount, &tb);
}

Здесь все еще пока передается CBitmap* из DLL а не HBITMAP потому что так легче эксперементировать DLL я пока не переписывал

Пробовал еще делать типа этого:

HBITMAP hBMP=LoadBitmap( hDll, MAKEINTRESOURSE(1001));

Все равно не работает Жаль
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #5 : 05-08-2004 07:45 » 

Цитата: Гром

В вольном переводе означает, что если ты делаешь FromHandle то объект CBitmap должен быть создан иначе он пропадет сразу же после переключения контекста.

В общем что у тебя видимо и происходит.
Вначале создаешь битмапный объект CreteCompatibleBitmap.


В смысле внутри CBitmap которому я пытаюсь присвоить HBITMAP уже должен быть создан Bitmap? а какой нужно указывать DC при его создании?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 05-08-2004 09:48 » 

USBLexus,  Теперь я кажется начинаю понимать. У тебя проблема не в преобразовании "CBitmap в HBITMAP и обратно".  AddBitmap() получает в качестве второго параметра указатель на CBitmap - конечно не работает преобразование
HBITMAP в *CBitmap - структуры в целое беззнаковое число.

Для этого есть СТАТИЧЕСКАЯ ф-я FromHandle
Попробуй так:
HBITMAP hBMP1= ::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP4));
CBitmap *pbmpNew = CBitmap::FromHandle(hBMP1);
GetToolBarCtrl().AddBitmap(1,pbmpNew);
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #7 : 05-08-2004 09:59 » 

Цитата: Джон
USBLexus,  Теперь я кажется начинаю понимать. У тебя проблема не в преобразовании "CBitmap в HBITMAP и обратно".  AddBitmap() получает в качестве второго параметра указатель на CBitmap - конечно не работает преобразование
HBITMAP в *CBitmap - структуры в целое беззнаковое число.

Для этого есть СТАТИЧЕСКАЯ ф-я FromHandle
Попробуй так:
HBITMAP hBMP1= ::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP4));
CBitmap *pbmpNew = CBitmap::FromHandle(hBMP1);
GetToolBarCtrl().AddBitmap(1,pbmpNew);


Ага))) Заработала Пасиба 8)

Можно еще вопрос в тему - интересно функция LoadBitmap будет работать если DLL на Delphi написана или на билдере?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
xelos
Гость
« Ответ #8 : 15-08-2004 19:00 » 

LoadBitmap - это функция винды. По идее все должно работать с любой dll.
насчет графических классов MFC - слушайте, что Гром сказал. Большинство графических объектов непостоянно. Если в программе надо сохранить хэндл - получайте его через функцию GetSafeHandle.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines