Почему CreateDIBSection возвращает NULL, а GetLastError возвращает 0 при изменении решения экрана? - PullRequest
1 голос
/ 19 января 2011

Ниже приведен мой код:

void Fun(int nScreenWidth, int nScreenHeight)
{
...
int nMemSize = nScreenWidth*nScreenHeight*3*7

HDC hdc = ::GetDC(hWnd);
int hBmpMapFile = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, nMemSize, NULL);

BITMAPINFO bmpInfo = {0};
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = 7*nScreenWidth;
bmpInfo.bmiHeader.biHeight = nScreenHeight;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;
bmpInfo.bmiHeader.biCompression = 0;
bmpInfo.bmiHeader.biSizeImage = nMemSize;
bmpInfo.bmiHeader.biXPelsPerMeter = 0;
bmpInfo.bmiHeader.biYPelsPerMeter = 0;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;
bmpInfo.bmiColors[0].rgbBlue = 204;
bmpInfo.bmiColors[0].rgbGreen = 204;
bmpInfo.bmiColors[0].rgbRed = 204;
bmpInfo.bmiColors[0].rgbReserved = 0;
PVOID pvBits = NULL;
HBITMAP hBmpWallpaper = ::CreateDIBSection(hdc, &bmpInfo, DIB_RGB_COLORS, &pvBits, hBmpMapFile, 0);
DWORD dwErr = ::GetLastErr();
...
}

Моя ОС - Windows XP, разрешение экрана - 1024 * 768, вызовите функцию:

Fun(1024, 768);

Я обнаружил, что CreateDIBSection возвращает NULLв то время как GetLastErr () возвращает 0. Но когда разрешение экрана составляет 2048 * 1536, вызовите функцию:

Fun(2048, 1536);

Я обнаружил, что CreateDIBSection возвращает действительный дескриптор.

Почему?

Похоже, что разрешение экрана приводит к тому, что CreateDIBSection возвращает недопустимое значение, я не знаю, почему.

Но в некоторых WINXP CreateDIBSection всегда успешно, независимо от разрешения экрана.Из теста я думаю, что причина кроется в HDC.HDC связан с разрешением экрана?

...