以下は私のコードです:
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();
...
}
私の OS は Windows XP で、画面の解像度は 1024*768 で、次の関数を呼び出します。
Fun(1024, 768);
CreateDIBSection が NULL を返し、GetLastErr() が 0 を返すことがわかりました。ただし、画面解像度が 2048*1536 の場合は、次の関数を呼び出します。
Fun(2048, 1536);
CreateDIBSection が有効なハンドルを返すことがわかりました。
なんで ?
画面の解像度が原因で CreateDIBSection が無効な値を返すようですが、理由はわかりません。
しかし、一部の WINXP では、CreateDIBSection は画面解像度に関係なく常に成功します。テストから、原因は HDC にあると思います。HDC は画面の解像度に関係していますか?