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);
Cela semble être le cas, car CreateBitMap ne fonctionnait pas non plus. Je vais essayer CreateDIBSection et voir comment ça marche. –
Yup, ça a fait l'affaire. –