CreateCompatibleBitmap не работает в Windows Mobile 6

Я портирую приложение с 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);

person SmacL    schedule 13.07.2010    source источник


Ответы (1)


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

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

person Josh Kelley    schedule 13.07.2010
comment
Вероятно, это так, поскольку CreateBitMap тоже не работал. Я попробую CreateDIBSection и посмотрю, как это работает. - person SmacL; 13.07.2010