Исправлено форматирование текста. — SchweinDeBurg
Есть класс содержащий указатель на CBitmap.
class CQuestion
{
public:
CQuestion(CQuestion& T);
CQuestion& operator=(const CQuestion& T);
CQuestion(void);
~CQuestion(void);
void Serialize(CArchive& ar);
private:
CString QuestionText;
std::vector<CVersion*> Versions;
CBitmap* Bitmap;
};
В конструкторе копирования не могу скопировать битмап. Проще говоря не знаю как создать копию объекта CBitmap. В примере
http://www.rsdn.ru/Forum/?mid=57838Автор: Ruslan Bondarev
Дата: 26.05.02
используется CDC, но у меня его нет нигде.
Исправлено форматирование текста. — SchweinDeBurg
По найденному материалу сотворил, но вылетает Assertion Debug...:
void CopyBitmap(CBitmap& resbitmap, CBitmap& src_bmp)
{
CWnd* desctop = CWnd::GetDesktopWindow();
CDC* desk_dc = desctop->GetDC();
ASSERT(desk_dc);
CDC src_dc;
src_dc.CreateCompatibleDC(desk_dc);
CBitmap* old_bmp_src = src_dc.SelectObject(&src_bmp);
BITMAP bmp = { 0 };
src_bmp.GetObject(sizeof(bmp), &bmp); // Вот здесь вылетает
const int width = bmp.bmWidth;
const int height = bmp.bmHeight;
CDC dest_dc;
dest_dc.CreateCompatibleDC(desk_dc);
CBitmap dest_bmp;
dest_bmp.CreateCompatibleBitmap(desk_dc, height, width);
CBitmap* old_bmp_dest = dest_dc.SelectObject(&dest_bmp);
BOOL res = dest_dc.BitBlt(0, 0, width, height, &src_dc, 0, 0, SRCCOPY);
ASSERT(res);
src_dc.SelectObject(old_bmp_src);
dest_dc.SelectObject(old_bmp_dest);
desctop->ReleaseDC(desk_dc);
HGDIOBJ old_bmp = resbitmap.Detach();
DeleteObject(old_bmp);
resbitmap.Attach(dest_bmp.Detach());
}
Здравствуйте, Mort, Вы писали:
M>В конструкторе копирования не могу скопировать битмап. Проще говоря не знаю как создать копию объекта CBitmap. В примере http://www.rsdn.ru/Forum/?mid=57838Автор: Ruslan Bondarev
Дата: 26.05.02
используется CDC, но у меня его нет нигде.
Если CDC нет, то можно и заиметь

Мне вообще-то не очень нравится сама идея копирования битмапов к операторе присваивания, особенно видя указатель — CBitmap* в примере.
Копируется себе указатель на существующий битмап и хорошо.
Если уж очень хочется — посмотрите
здесь
и прочтите комментарии там же на странице почему это плохо.
Убедительная просьба — использовать коды форматирования при вставке текстов программ.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
Спасибо !
Полная копия битмапа была принципиальным условием. В результате получилось вот, тестировал работает нормально:
// Q.h
class CQuestion //Объект содержащий битмап
{
CBitmap* imgOriginal; //Память выделяется и освобождается в конструкторе
public:
SetBitmap(CBitmap& src_bmp);
}
// Q.cpp
void CQuestion::SetBitmap(CBitmap& src_bmp){
if(src_bmp.m_hObject == NULL) //копия пустого объекта
{
if(imgOriginal->m_hObject!=NULL)
{
HGDIOBJ Obj = imgOriginal->Detach();
DeleteObject(Obj);
}
return;
}
CWnd* desctop = CWnd::GetDesktopWindow();
CDC* desk_dc = desctop->GetDC();
ASSERT(desk_dc);
CDC src_dc;
src_dc.CreateCompatibleDC(desk_dc);
CBitmap* old_bmp_src = src_dc.SelectObject(&src_bmp);
BITMAP bmp = { 0 };
src_bmp.GetBitmap(&bmp); //почему-то неконстантая функция..
const int width = bmp.bmWidth;
const int height = bmp.bmHeight;
CDC dest_dc;
dest_dc.CreateCompatibleDC(desk_dc);
CBitmap dest_bmp;
dest_bmp.CreateCompatibleBitmap(desk_dc, width, height);
CBitmap* old_bmp_dest = dest_dc.SelectObject(&dest_bmp);
BOOL res = dest_dc.BitBlt(0, 0, width, height, &src_dc, 0, 0, SRCCOPY);
ASSERT(res);
src_dc.SelectObject(old_bmp_src);
dest_dc.SelectObject(old_bmp_dest);
desctop->ReleaseDC(desk_dc);
HGDIOBJ old_bmp = imgOriginal->Detach();
DeleteObject(old_bmp);
imgOriginal->Attach(dest_bmp.Detach());
}