Как скопировать CBitmap - член моего класса
От: Mort  
Дата: 25.04.07 12:25
Оценка:
Исправлено форматирование текста. — 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, но у меня его нет нигде.
Re: Как скопировать CBitmap - член моего класса
От: Mort  
Дата: 25.04.07 13:28
Оценка:
Исправлено форматирование текста. — 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());
}
Re: Как скопировать CBitmap - член моего класса
От: febus Германия  
Дата: 25.04.07 13:30
Оценка:
Здравствуйте, Mort, Вы писали:
M>В конструкторе копирования не могу скопировать битмап. Проще говоря не знаю как создать копию объекта CBitmap. В примере http://www.rsdn.ru/Forum/?mid=57838
Автор: Ruslan Bondarev
Дата: 26.05.02
используется CDC, но у меня его нет нигде.


Если CDC нет, то можно и заиметь
Мне вообще-то не очень нравится сама идея копирования битмапов к операторе присваивания, особенно видя указатель — CBitmap* в примере.
Копируется себе указатель на существующий битмап и хорошо.
Если уж очень хочется — посмотрите здесь
и прочтите комментарии там же на странице почему это плохо.
[от модератора]
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 25.04.07 13:47
Оценка:
Убедительная просьба — использовать коды форматирования при вставке текстов программ.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Re[2]: Как скопировать CBitmap - член моего класса
От: Аноним  
Дата: 26.04.07 09:54
Оценка:
Спасибо !

Полная копия битмапа была принципиальным условием. В результате получилось вот, тестировал работает нормально:

// 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());
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.