2010-07-13 16 views
1

Je transfère une application de Windows Mobile 2003 vers Windows Mobile 6, sous Visual Studio 2008. Le périphérique cible dispose d'un écran de résolution VGA et j'ai été surpris de constater que le code suivant échoue;CreateCompatibleBitmap échoue sur Windows Mobile 6

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); 
} 

Le code de retour de CreateCompatibleBitmap est 8, ce qui se traduit par « Mémoire insuffisante pour traiter la commande. nWidth est 350, nHeight est 400, et l'affichage est de 16 bits par pixel, donc mon bitmap est un énorme 280K. L'appareil que j'utilise a 256 Mo de mémoire de programme, et j'ai dit à l'éditeur de liens de réserver 4 Mo de pile et 64 Mo de tas. Des idées de ce que je fais de mal, et plus important encore une solution? J'ai utilisé un code similaire à celui ci-dessus sur Windows CE depuis CE 2.1 sans problèmes.

Editer: Selon la publication de Josh Kelly, j'ai migré vers des bitmaps indépendants de l'appareil qui fonctionnent bien sur l'appareil. Le code est maintenant quelque chose comme ça

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); 

Répondre

3

Je ne l'ai pas fait aucune programmation Windows CE/Windows Mobile, mais je l'ai traité un similar problem (CreateCompatibleBitmap défaut avec ERROR_NOT_ENOUGH_MEMORY) dans le bureau Windows. Apparemment, d'après ce que j'ai pu constater en regardant autour de moi en ligne, Windows peut imposer des limites globales sur la mémoire disponible pour les bitmaps dépendant du périphérique. (Par exemple, certains pilotes vidéo peuvent choisir de stocker des bitmaps dépendants du périphérique dans la RAM vidéo, auquel cas vous êtes limité par la quantité de RAM de votre carte vidéo.) Voir, par exemple, this thread. De ce que je peux dire, ces limites sont déterminées par les cartes vidéo individuelles ou les pilotes; le stockage de certains ordinateurs peut être effectivement illimité, d'autres peuvent avoir des limites strictes.

Une solution consiste à utiliser à la place des bitmaps indépendants du périphérique, même s'ils ont une légère pénalité de performance.

+0

Cela semble être le cas, car CreateBitMap ne fonctionnait pas non plus. Je vais essayer CreateDIBSection et voir comment ça marche. –

+0

Yup, ça a fait l'affaire. –