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. Устройството, което използвам, има 256mb програмна памет и аз казах на линкера да резервира 4mb стек и 64mb купчина. Някакви идеи какво правя грешно и по-важното решение? Използвам код, подобен на горния в 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 може да наложи глобални ограничения върху наличната памет за растерни изображения, зависещи от устройството. (Например, някои видео драйвери може да изберат да съхраняват зависещи от устройството растерни изображения във видео RAM, в който случай сте ограничени от това колко RAM има на вашата видеокарта.) Вижте например тази тема. Доколкото мога да кажа, тези ограничения се определят от отделните видео карти или драйвери; съхранението на някои компютри може да бъде ефективно неограничено, други може да имат строги ограничения.

Едно решение е вместо това да се използват независими от устройството растерни изображения, въпреки че имат лека загуба на производителност.

person Josh Kelley    schedule 13.07.2010
comment
Това изглежда вероятно да е така, тъй като CreateBitMap също не работи. Ще опитам CreateDIBSection и ще видя как ще се справи. - person SmacL; 13.07.2010