Ошибка CreateDIBSection () - как диагностировать - PullRequest
0 голосов
/ 13 мая 2019

У меня есть вызов CreateDIBSection (), который возвращает 0. В документации сказано, что это означает, что «один или несколько входных параметров недопустимы», но нет указания на , какой параметр недопустим .

Я посмотрел, что этот ТАК вопрос, в котором вопрос заканчивается словами "после CreateDIBSection я обнаружил, что код ошибки 8, недостаточно ресурсов" - это меня смутило - нет упоминаний ни об одной ошибке коды в документации . Как постер получил эту дополнительную информацию?

РЕДАКТИРОВАТЬ: В соответствии с просьбой, вот мой код - я должен извиниться, он не завершен - он является частью огромной программы, и создание минимальной программы winapi не тривиально.

HDC hdcTemp;
BYTE* bitPointer;

hdcTemp = CreateCompatibleDC(hdc_desktop);

my_printf("GetDeviceCaps(hdcTemp,BITSPIXEL) = %d\n",GetDeviceCaps(hdcTemp,BITSPIXEL)); // this prints "32"

static BITMAPINFO bitmap;

bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = 280;
bitmap.bmiHeader.biHeight = height_to_check;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 32;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 280 * 4 * height_to_check;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;

HBITMAP hBitmap2 = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);

Ответы [ 2 ]

1 голос
/ 13 мая 2019

изменить на

BYTE* bitPointer;
HDC hdcScreen = GetDC(NULL);
static BITMAPINFO bitmap;

bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = 280;
bitmap.bmiHeader.biHeight = height_to_check;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 32;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 280 * 4 * height_to_check;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;

HBITMAP hBitmap2 = CreateDIBSection(hdcScreen, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
ReleaseDC(NULL, hdcScreen);

т.е. не передавать HDC, возвращенный из CreateCompatibleDC, в CreateDIBSection;используйте контекст устройства на экране.

Вызов CreateCompatibleDC создает контекст устройства с монохромным растровым изображением 1x1, связанным с ним, независимо от того, какой HDC вы передали, поэтому при создании раздела растрового изображения или DIB, совместимого с этим HDC, Win32 пытаетсябыть совместимым с монохромным растровым изображением, которое вам не нужно.

0 голосов
/ 16 мая 2019

В настоящее время MSDN указывает на то, что «один или несколько входных параметров недопустимы». Тесты показывают, что если размер растрового изображения слишком велик или входное значение недопустимо, например, ноль, будет возвращено значение NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...