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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: CreateCompatibleBitmap возврашает ERROR_NOT_ENOUGH_MEMORY  (Прочитано 10962 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AokiSuguru
Гость
« : 14-01-2009 12:21 » 

Добрый день.
Пишу программку на Visual C++, XP Win
Пытаюсь реализовать Double Buffer:
Код:
CPaintDC dc(this);
CDC backBuff;

backBuff.CreateCompatibleDC(&dc);

CRect rcClient;
GetClientRect(&rcClient);

CBitmap *m_pBackBit = new CBitmap();

if (m_pBackBit->CreateCompatibleBitmap(&dc, m_Size.cx, m_Size.cy) == 0)
{
DWORD dw = GetLastError();
ASSERT(dw == 0);
}

CPaint::OnPaint(&backBuff, m_nX);
dc.BitBlt(0, 0, rcClient.right, rcClient.bottom, &backBuff, 0, 0, SRCCOPY);

m_pBackBit->DeleteObject();

Но при значениях m_Size больше чем (примерно) 1200*1800, CreateCompatibleBitmap() возвращает 0, а GetLastError() - 8 (ERROR_NOT_ENOUGH_MEMORY).

Специально написал простенькую программу, которая использует Double Buffer и там создаются битмапы вплоть до 6000*6000 без ошибок.

В чем может быть дело?

Оперативной памяти предостаточно - из 1600 Мб доступных, программа занимает около 150 Мб
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 14-01-2009 12:39 » 

AokiSuguru, поройся в FAQ (у меня в подписи ссылка) я вроде писал там. Если не найдёшь - вечером напишу тогда тут
Записан

AokiSuguru
Гость
« Ответ #2 : 14-01-2009 12:45 » 

Просмотрел все три части. Ничего подходящего не нашел А черт его знает...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 14-01-2009 12:54 » 

AokiSuguru, https://forum.shelek.ru/index.php/topic,11839.msg153369.html#msg153369

смотри в конце статьи исходники, ищи в них OnPaint , дальше думаю разберёшься )
Записан

AokiSuguru
Гость
« Ответ #4 : 14-01-2009 13:49 » 

Посмотрел. Но где, собственно, ответ на мой вопрос? как создавать второй DC я знаю.
Мне нужен битмап который больше окна. Проблема в том, что в маленьком приложении создается большой битмап, а в моем (отнюдь не маленьком) большой битмап создать нельзя.


использовал CreateCompatibleBitmap(&backBuff, m_Size.cx, m_Size.cy)
вместо CreateCompatibleBitmap(&dc, m_Size.cx, m_Size.cy)
Заработало. битмап размером 6000*6000 создает


предыдущее решение позволяет создавать монохромный битмап  Улыбаюсь
Для создания полноцветного битмапа можно (и нужно) использовать CreateDIBSection.

Цитата
//процедура создания DIB растра
HBITMAP CMyView::CreateDIB(HDC hdc, int cx, int cy)
{
BITMAPINFO bmi;
LPVOID pBitmapBits=NULL;
LPVOID pBytes=NULL;
HBITMAP   hDib=NULL;

// Запоняем структуру BITMAPINFO
memset(&bmi, 0, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = cx;
bmi.bmiHeader.biHeight = cy;
bmi.bmiHeader.biPlanes = 1;

// 24 бита на цвет. В этом случе будут тройки RGB
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = ((((cx * bmi.bmiHeader.biBitCount) + 31) &~31) >> 3) * cy;

// Пытаемся создать DIB
hDib =::CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS,
&pBitmapBits, NULL, (DWORD)0);

//проверяем, что получилось
ASSERT(hDib);

return hDib;
}


И теперь, например:
CBitmap* m_pBitmap;
***
строку
m_pBitmap->CreateCompatibleBitmap(dc,cx,cy);
заменяем на
m_pBitmap->m_hObject=CreateDIB(dc.GetSafeHdc(),cx,cy);
(если не нравиться такое присвоение, то можно исп. метод FromHandle() класса CBitmap)
остальное оставляем всё так же.

from http://www.rsdn.ru/Forum/?mid=21936

Проблема решена.
« Последнее редактирование: 14-01-2009 21:10 от RXL » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 15-01-2009 04:56 » 

хех, я думал тебе надо
Цитата
Пытаюсь реализовать Double Buffer
сорри, если не так понял

Тебе надо значит просто скроллинг и ограниченную область видимости битмапа ?
Записан

AokiSuguru
Гость
« Ответ #6 : 15-01-2009 12:39 » 

Нужно было создать огромный битмап. А CreateCompatibleBitmap не создавала.
Тут даже про дабл буфер наверное зря написал %(
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 15-01-2009 12:50 » 

так название функции даже говорит, CreateCompatibleBitmap  - создать совместимый битмап Улыбаюсь Вот и не создаёт "большой"
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines