Ошибка CreateCompatibleBitmap на Windows Mobile 6 - PullRequest
1 голос
/ 13 июля 2010

Я портирую приложение с Windows Mobile 2003 на Windows Mobile 6 под Visual Studio 2008. Целевое устройство имеет экран с разрешением VGA, и я был удивлен, обнаружив, что следующий код не работает:

CClientDC ClientDC(this);
 CRect Rect;
 GetClientRect(&Rect);

 int nWidth = Rect.Width(),nHeight = Rect.Height();
 CBitmap Temp;
 if (!Temp.CreateCompatibleBitmap(&ClientDC,nWidth,nHeight))
 {
  LogError(elvl_Debug,_T("Error creating bitmap (%s)"),LastSysError());

 } else
 {
  BITMAP bmpinfo;
  Temp.GetBitmap(&bmpinfo);
 }

Код возврата из CreateCompatibleBitmap равен 8, что означает «Недостаточно памяти для обработки команды.nWidth - 350, nHeight - 400, а дисплей - 16 бит на пиксель, поэтому моя битовая карта - колоссальные 280K.Устройство, которое я использую, имеет 256 МБ памяти программ, и я сказал компоновщику зарезервировать 4 МБ стека и 64 МБ кучи.Есть идеи, что я делаю не так, а главное решение проблемы?Я использую код, аналогичный описанному выше, в Windows CE, начиная с CE 2.1, без проблем.

Редактировать: Согласно сообщению Джоша Келли, я перешел на независимые от устройства растровые изображения, которые отлично работаютУстройство.Код теперь примерно такой

CClientDC ClientDC(this);
CRect Rect;
GetClientRect(&Rect);
int nWidth = Rect.Width(),nHeight = Rect.Height();
BITMAPINFOHEADER bmi = { sizeof(bmi) }; 
bmi.biWidth = nWidth; 
bmi.biHeight = nHeight; 
bmi.biPlanes = 1; 
bmi.biBitCount = 8; 
HDC hdc = CreateCompatibleDC(NULL); 
BYTE* pbData = 0; 
HBITMAP DIB = CreateDIBSection(hdc, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, (void**)&pbData, NULL, 0);
CBitmap *pTempBitmap = CBitmap::FromHandle(DIB);

1 Ответ

3 голосов
/ 13 июля 2010

Я не занимался программированием для Windows CE / Windows Mobile, но я имел дело с подобной проблемой (CreateCompatibleBitmap с ошибкой ERROR_NOT_ENOUGH_MEMORY) в настольной Windows. Судя по всему, что я могу судить по просмотру онлайн, Windows может наложить глобальные ограничения на доступную память для зависимых от устройства растровых изображений. (Например, некоторые видеодрайверы могут выбрать сохранение зависящих от устройства растровых изображений в видеопамяти, в этом случае вы ограничены объемом ОЗУ на вашей видеокарте.) См., Например, этот поток . Из того, что я могу сказать, эти ограничения определяются отдельными видеокартами или драйверами; хранение некоторых компьютеров может быть практически неограниченным, другие могут иметь жесткие ограничения.

Одно из решений состоит в том, чтобы вместо этого использовать независимые от устройства растровые изображения, даже если они имеют небольшое снижение производительности.

...