Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2013, 07:34   #1
SeerRus
 
Регистрация: 01.07.2013
Сообщений: 8
По умолчанию CBitmap - копирование части, рисование наложением

1. Есть CBitmap A,B. Я хочу передать из A в B только часть его содержимого, определив эту часть например через регион. Предполагаю, что надо использовать CDC с функцией SelectClipRgn, чтобы определить этот регион, и затем записать это изображение в B. Но как это сделать?

2. Есть CBitmap A,B. Я хочу нарисовать сначала изображение A, затем B так, чтобы нарисовать только суть изображения B, без фона. Рисую через CDC и BitBlt.
Например, A - большой синий круг, B - маленький желтый круг. Если B рисовать в центре A, то в центре A будет: с SRCCOPY будет белый прямоугольник со вписанным желтым кругом, с SRCAND зеленый круг в центре синего.
Как это решить?
SeerRus вне форума Ответить с цитированием
Старый 01.07.2013, 08:34   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

По пункту 2 читайте про TransparentBlt() и AlphaBlend(). Возмножно, что в MFC их нет и придется вызывать напрямую.
waleri вне форума Ответить с цитированием
Старый 01.07.2013, 11:53   #3
SeerRus
 
Регистрация: 01.07.2013
Сообщений: 8
По умолчанию

Спасибо, TransparentBlt хорошее решение. К тому же можно использовать FillRgn для определения маски для этой функции.
Вопрос по первой задаче остался.
SeerRus вне форума Ответить с цитированием
Старый 02.07.2013, 08:34   #4
SeerRus
 
Регистрация: 01.07.2013
Сообщений: 8
По умолчанию

Кто-нибудь может сказать как сохранить изображение из CDC в CBitmap?
SeerRus вне форума Ответить с цитированием
Старый 02.07.2013, 08:45   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

CBitmap bitmap.
CDC dc;
dc.SelectObject(bitmap);
dc.RisuemZdes();
// Zdes uje bitmap narisovan
waleri вне форума Ответить с цитированием
Старый 02.07.2013, 09:21   #6
SeerRus
 
Регистрация: 01.07.2013
Сообщений: 8
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
CBitmap bitmap.
CDC dc;
dc.SelectObject(bitmap);
dc.RisuemZdes();
// Zdes uje bitmap narisovan
Это нарисует bitmap на dc, а надо наоборот - из dc сохранить изображение в bitmap для дальнейшего использования.
SeerRus вне форума Ответить с цитированием
Старый 02.07.2013, 10:27   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

dc всегда рисует в битмап.
Надо создать свой dc, напоример через dc.CreateCompatibleDC() и "прочитать" изначальный dc через BitBlt
waleri вне форума Ответить с цитированием
Старый 02.07.2013, 16:33   #8
SeerRus
 
Регистрация: 01.07.2013
Сообщений: 8
По умолчанию

Тогда посмотрите пожалуйста этот код:
m_bitmaps - это вектор для хранения полученных CBitmap-ов из большого CBitmap

m_bitmaps.clear();
m_bitmaps.reserve(4);

// DС с картинкой-источником
CDC SourceDC, destDC;
SourceDC.CreateCompatibleDC(pMainDC );
destDC.CreateCompatibleDC(pMainDC);

CBitmap bmpWhole;
bmpWhole.LoadBitmap(IDB_TEST_BITMAP );
SourceDC.SelectObject(&bmpWhole);

for (int x=100; x>=0; x-=100)
for (int y=100; y>=0; y-=100)
{
// создание нового CBitmap
CBitmap *destBitmap = new CBitmap();
destBitmap->CreateCompatibleBitmap(&destDC, 100, 100);
// установка назначения для destDC
CBitmap *oldBitmap = destDC.SelectObject(destBitmap);
// копирование
destDC.BitBlt(0,0,100,100,&SourceDC ,x,y,SRCCOPY);
// добавить результат в вектор
m_bitmaps.push_back(destBitmap);
// откат
destDC.SelectObject(oldBitmap);
}

bmpWhole.DeleteObject();
destDC.DeleteDC();
SourceDC.DeleteDC();

// рисует все CBitmap из вектора m_bitmaps
DrawTest2();

В результате вместо 4 кусков картинок будут нарисованы 4 чёрных квадрата. DrawTest2 рисует корректно, проверил.
Что здесь надо исправить чтобы в вектор были загружены части картинки?
SeerRus вне форума Ответить с цитированием
Старый 02.07.2013, 16:54   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Я бы начал с проверок что возвращают функции - возможно где-то есть ошибка.
waleri вне форума Ответить с цитированием
Старый 02.07.2013, 17:47   #10
SeerRus
 
Регистрация: 01.07.2013
Сообщений: 8
По умолчанию Нашёл решение

Parsing the CBitmap and initializing the vector

m_bitmaps.clear();
m_bitmaps.reserve(4);

CDC SourceDC, destDC;
SourceDC.CreateCompatibleDC(pMainDC );

CBitmap bmpWhole;
bmpWhole.LoadBitmap(IDB_TEST_BITMAP );
SourceDC.SelectObject(&bmpWhole);

for (int x=100; x>=0; x-=100)
for (int y=100; y>=0; y-=100)
{
CImage *destImage = new CImage();
destImage->Create(100, 100, 24);

destDC.Attach(destImage->GetDC());
destDC.BitBlt(0,0,100,100,&SourceDC ,x,y,SRCCOPY);
destDC.Detach();
destImage->ReleaseDC();

m_bitmaps.push_back(destImage);
}

bmpWhole.DeleteObject();
destDC.DeleteDC();
SourceDC.DeleteDC();

Draw:

WORD nShift=0;
for (auto iter = m_bitmaps.begin(); iter != m_bitmaps.end(); ++iter, nShift+=110)
{
CBitmap* pBitmap = CBitmap::FromHandle((*iter)->operator HBITMAP());

CDC memDC;
memDC.CreateCompatibleDC(pMainDC);
memDC.SelectObject(pBitmap);
pMainDC->BitBlt(nShift, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
}
SeerRus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
копирование части ячейки егоровна Microsoft Office Excel 6 27.08.2012 17:44
Копирование части данных ячейки Doszhan Microsoft Office Excel 15 04.11.2011 07:49
Копирование части строчки AlexMe Общие вопросы Delphi 2 26.06.2011 22:20
Копирование части диапазона с шагом valerij Microsoft Office Excel 5 08.12.2009 17:53
Копирование части экрана консоли в C# Skrutik Общие вопросы .NET 3 03.03.2009 19:13